2013-07-03 78 views
0

如何在執行.net代碼之前獲得一個asp:按鈕來執行一些jquery?執行jQuery,然後執行.NET

我基本上有一個asp:button,它附帶了一些jquery-ajax和一些.NET代碼。我注意到,如果jQuery是簡單的,就像顯示警報一樣,一切都可以工作,但是如果jquery更復雜,即它必須去連接數據庫的ajax,它似乎不起作用,它只是執行互聯網。

我假設這與速度有關係? .NET代碼在jQuery腳本完成之前啓動?

所以我的問題是,我如何設置這個,所以當單擊asp:按鈕時,jquery是否是事情,並且一旦jquery完成,.net部分運行?

+0

你的意思是提交表單? – kingdamian42

+0

是的,所以如果它只是一個簡單的jQuery,那麼提交會被一個警告停止,例如。當警報關閉時,提交繼續。但是,如果它是複雜的jQuery,我認爲jquery不能夠快速完成以停止提交?不知道爲什麼它不起作用。 – oshirowanen

+1

這是因爲AJAX變得異步,而不是阻塞。您可以使用'e.preventDefault()'阻止jQuery中的提交,然後在AJAX的'success'回調中調用點擊的POST。 –

回答

-1
  1. 首先是您的ajax調用異步或同步? 你會使用推遲和承諾概念

2,創建一個隱藏的按鈕,從jQuery的點擊Ajax調用成功後,按鈕使Ajax調用。而真正的按鈕返回false,所以它不會執行回發。

+0

它是異步的,或者他不會有問題,第二個建議不好,因爲它不會觸發服務器端的asp.net事件。 – Archer

+0

它只會觸發服務器端事件,他需要在aspx中爲其他按鈕創建runat = server。 –

+0

它不會觸發服務器上的按鈕單擊事件。 – Archer

0

普利文的觀點(以下downvoted)約異步或同步是非常重要的位置。

「OnClientClick」答案只適用於同步的東西。如果您有AJAX或Promise,我發現的最佳模式是:

1)。使用javascript停止按鈕的默認行爲:

OnClientClick="return false;" 

2)。爲按鈕創建單獨的Javascript事件處理程序:

$(document).ready(function (e) { 
      $("[id$='btn']").click(function(){ 

3)。調用客戶端的ASP驗證器(如果沒有,請跳過)。

if (Page_ClientValidate()) 
      { 

4)。到AJAX完成的功能,或在promise.then()傳遞一個函數來提交表單觸發按鈕單擊事件

__doPostBack('<%= btn.ClientID %>', 'OnClick'); 

除非你正在處理的承諾或AJAX,將一切似乎確實令人費解。

下面是一個完整的例子頁面:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="aaaaa_test.aspx.cs" Inherits="test" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script> 
    <script type="text/javascript"> 

     $(document).ready(function (e) { 

      //2). use the click event to capture the canceled submit. 
      $("[id$='cmdSubmit']").click(function(){ 
       //3). Allow the asp client-side page validators to do their thing... 
       if (Page_ClientValidate()) 
       { 
        ReturnsPromise().then(function() { 
         //4). once the Asynchronous stuff is done, re-trigger the postback 
         // and make sure it gets handled by the proper server-side handler. 
         __doPostBack('<%= cmdSubmit.ClientID %>', 'OnClick'); 
        }); 
       } 
      }); 

      // very simple promise, usually this woud be an AJAXy thing..... 
      // a placeholder for your real promise. 
      function ReturnsPromise() 
      { 
       //this is just a simple way to generate a promise for this example. 
       return Promise.resolve($("[id$='hiddenField']").val($("[id$='txtInput']").val())); 
      } 

     }); 

    </script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 

     <asp:HiddenField ID="hiddenField" runat="server" /> 
     Input:<asp:TextBox ID="txtInput" runat="server"></asp:TextBox> 
     <asp:RequiredFieldValidator ID="valInput" runat="server" ErrorMessage="Add Text" ControlToValidate="txtInput" EnableClientScript="True" Text="Add Text"></asp:RequiredFieldValidator> 
     <br /> 
     <!-- 1). use client script to stop the default button behavior with OnClientClick="return false;" --> 
     <asp:Button ID="cmdSubmit" runat="server" OnClick="cmdSubmit_Click" Text="Submit" OnClientClick="return false;" /> 

    </div> 
    </form> 
</body> 
</html>