`asp:Button` 渲染為 ``,默認**提交表單觸發 PostBack**。要阻止 PostBack 並僅執行客戶端 JS,關鍵在於 `OnClientClick` 返回 `false`。
<asp:Button ID="btnClientOnly" runat="server" Text="純客戶端"
OnClientClick="alert('僅彈窗,不回發'); return false;" />
[System.Web.Services.WebMethod]
public static string ServerSideLogic(string input)
{
System.Threading.Thread.Sleep(1000); // 模擬耗時操作
return $"服務器處理完成:{input} - {DateTime.Now:HH:mm:ss}";
}
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
<asp:TextBox ID="txtInput" runat="server" Placeholder="輸入內容" />
<asp:Button ID="btnAjax" runat="server" Text="AJAX 提交"
OnClientClick="callServer(); return false;" />
<span id="spnResult" style="margin-left:10px;color:green;"></span>
<script>
function callServer() {
var input = document.getElementById('<%= txtInput.ClientID %>').value;
var btn = document.getElementById('<%= btnAjax.ClientID %>');
var result = document.getElementById('spnResult');
btn.disabled = true; btn.value = '處理中...';
result.innerText = '';
// ASP.NET AJAX PageMethods 調用
PageMethods.ServerSideLogic(input,
function(response) { // 成功回調
result.innerText = response;
btn.disabled = false; btn.value = 'AJAX 提交';
},
function(error) { // 失敗回調
result.innerText = '錯誤: ' + error.get_message();
result.style.color = 'red';
btn.disabled = false; btn.value = 'AJAX 提交';
}
);
}
</script>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script>
function callServerJQuery() {
var input = $('#<%= txtInput.ClientID %>').val();
var $btn = $('#<%= btnAjax.ClientID %>').prop('disabled', true).val('處理中...');
$('#spnResult').text('');
$.ajax({
type: 'POST',
url: 'Default.aspx/ServerSideLogic', // 頁面路徑/方法名
data: JSON.stringify({ input: input }),
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function(resp) {
$('#spnResult').text(resp.d).css('color', 'green');
},
error: function(xhr) {
$('#spnResult').text('錯誤: ' + xhr.responseText).css('color', 'red');
},
complete: function() {
$btn.prop('disabled', false).val('AJAX 提交');
}
});
}
</script>
<asp:Button ID="btnJQueryAjax" runat="server" Text="jQuery AJAX"
OnClientClick="callServerJQuery(); return false;" />
| 屬性 | 觸發時機 | 返回值作用 | 典型用途 |
|---|---|---|---|
| OnClientClick | 客戶端點擊,**最先**執行 | `false` = 取消 PostBack,`true`/`undefined` = 繼續 PostBack | 客戶端驗證、彈窗確認、AJAX 調用、動畫 |
| OnClick | PostBack 到達服務器,**後**執行 | 無(void) | 服務器邏輯:存 DB、發郵件、重定向 |
| UseSubmitBehavior="false" | 渲染為 `` 而非 `submit` | 不提交表單,**隱式阻止 PostBack** | 純客戶端按鈕,配合 OnClientClick |
| CausesValidation="false" | 跳過客戶端/服務端驗證 | 不影響 PostBack 本身 | 取消按鈕、重置按鈕 |
<asp:Button ID="btnPureClient" runat="server" Text="純客戶端按鈕"
UseSubmitBehavior="false"
OnClientClick="console.log('不提交表單,可直接訪問 CS 代碼: ' + this.id);" />
渲染為 ``,**完全不提交表單**,但後台 `FindControl("btnPureClient")` 仍可獲取對象,適合純前端交互(如彈窗、頁面跳轉、打印)。
| 需求 | 推薦寫法 |
|---|---|
| 純客戶端邏輯(彈窗/跳轉/動畫) | `OnClientClick="logic(); return false;"` |
| AJAX 調用後台 WebMethod | `OnClientClick="PageMethods.Method(); return false;"` |
| jQuery AJAX 調用靜態方法 | `OnClientClick="$.ajax(...); return false;"` |
| 完全不提交、但後台需引用 | `UseSubmitBehavior="false" OnClientClick="..."` |
| 取消/重置按鈕 | `CausesValidation="false" OnClientClick="resetForm(); return false;"` |
掌握 **`return false` 是阻斷 PostBack 的唯一標準**,結合 `UseSubmitBehavior`、`CausesValidation`、`ValidationGroup`,全面掌控按鈕行為。