2016-04-19 187 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