2016-04-19 140 views
2

试图阻止这段代码在网页加载时运行。Javascript onload MVC ASP .NET MVC

<input type="submit" class="btn btn-info col-md-pull-4" value="Download" id="mybutton" onclick="myFunction"> 

<script type="text/javascript"> 
function myFunction() { 
    document.getElementById("mybutton") = @api.function(); 
} 
</script> 

每当我加载页面,这连接到web api并启动api.function代码。我只想在点击按钮时发生这种情况。

我该怎么做呢?

+0

我不认为你包括了你所有的代码,因为只有当你点击你发布的按钮时才会调用该函数。如果你想知道什么是调用它,那么在执行时查看堆栈跟踪。为此,在函数中添加一行并编写'debugger;',然后在开发人员/调试工具打开的情况下将页面加载到选择的浏览器中,该工具应当停止脚本执行。然后查看堆栈跟踪并找出正在进行的调用。 – Igor

+0

另外我/我们不知道'@ api.function()'做了什么,你确定调用api不是从服务器而是从客户端创建的吗? – Igor

+1

问题是服务器端代码运行时调用服务器端代码'@ api.function()'。 看看浏览器中的源代码(打开页面,查看源代码) - 你会发现'@ api.function()'的结果被嵌入到源代码中。 –

回答

2

从评论:

保罗:它(@api.function())执行外部程序的工作流。基本上只是在不同的应用程序中启动一个进程。无论如何阻止Razor在页面加载时渲染它,只有当我点击按钮时才会渲染它。

简短的回答 - 不会。您在混淆服务器端和客户端代码。有一个区别。服务器端代码在模型,控制器和剃刀视图中执行。客户端代码在Web浏览器的上下文中使用JavaScript执行,但是此代码无法访问服务器端代码/进程。它具有的唯一访问权限与从浏览器运行的任何访问权限相同,它使用URL调用HTTP调用服务器并传入数据。

如果你想@api.function()要在单击名为您有这些选项:

  1. 后回 - 创建一个回/提交,并开始从你的MVC控制器这个过程。在这种情况下,完全删除客户端脚本标签并依靠服务器代码来启动该过程。
  2. 在您现有的MVC控制器或新的Web API控制器中创建新的公共方法。将此方法标记为HttpPost属性,然后使用JQuery .ajax调用调用它。这将允许提交电话而不需要表单发布。
+1

好的,我现在明白了。谢谢@Igor – Paul

0

我不明白你为什么要调用一个服务器方法onload?难道你不能从开始就加载你需要的数据吗?

在任何情况下与jquery替代

:这是因为剃刀呈现@ api.function

$("#mybutton").on("click", function(){ 
    // call server 
}) 
0

()和呈现的结果是该函数的执行。你能解释@ api.function()是什么,它有什么作用?

+0

它在外部程序中执行工作流程。基本上只是在不同的应用程序中启动一个进程。无论如何阻止Razor在页面加载时渲染它,只有当我点击按钮时才会渲染它。 – Paul

+0

@保罗 - 没有。您将客户端代码与服务器端代码混淆。你不能混合2. – Igor

+0

好吧,所以也许这会更好地解释: 在页面加载,我initalise连接到应用程序。 我想要页面加载页面上的HTML。 页面上有一个按钮。当我点击这个按钮时,我想让web服务执行一个功能。 代码: \t Webservice client = new Webservice(); \t \t <脚本类型= “文本/ JavaScript的”> \t \t function myFunction(){ \t \t \t document.getElementById(“myButton”)= @ client.executeObject(); \t \t} \t – Paul