普利文的觀點(以下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>
你的意思是提交表單? – kingdamian42
是的,所以如果它只是一個簡單的jQuery,那麼提交會被一個警告停止,例如。當警報關閉時,提交繼續。但是,如果它是複雜的jQuery,我認爲jquery不能夠快速完成以停止提交?不知道爲什麼它不起作用。 – oshirowanen
這是因爲AJAX變得異步,而不是阻塞。您可以使用'e.preventDefault()'阻止jQuery中的提交,然後在AJAX的'success'回調中調用點擊的POST。 –