ASP.NET 的「Enter 鍵提交」其實不是框架特有機制,而是瀏覽器對 <form> 中第一個 type="submit" 按鈕的預設行為。當游標位於表單元素時,瀏覽器會自動鎖定該表單內第一個(依文件流順序:左到右、上到下)提交按鈕,等待 Enter 鍵觸發提交。
<form action="">
<input type="text" />
<input type="submit" value="submit" />
</form>
<form action="">
<input type="text" />
<input type="button" value="submit" />
</form>
第一個表單按 Enter 會提交,第二個不會——因為第二個按鈕是 type="button",不具備預設提交行為。
<asp:Button> 預設渲染為 <input type="submit">,具備原生提交行為。<input type="button" onclick="__doPostBack(...)">,屬於普通按鈕,不具備 Enter 自動提交特性。<form id="form1" runat="server" defaultbutton="Button1">
defaultButton 值為目標按鈕的 ClientID(含命名容器前綴,如 ContentPlaceHolder1$btnSubmit)。注意:在複合控制項或模板中可能失效(未測試)。
<asp:Button ID="Button1" runat="server" Text="Button"
OnClick="Button1_Click" UseSubmitBehavior="false" />
渲染時會改為 type="button",移除原生提交行為,改由 __doPostBack 處理。
若需更精細控制(如特定 TextBox 按 Enter 執行特定邏輯),可在 Page_Load 註冊客戶端腳本:
TextBox1.Attributes.Add("onkeydown",
"if(event.which || event.keyCode){ " +
"if ((event.which == 13) || (event.keyCode == 13)) { " +
"document.getElementById('" + Button1.UniqueID + "').click();return false;}} " +
"else {return true}; ");
此法直接模擬點擊目標按鈕,繞過瀏覽器預設行為。
使用母版頁時,按鈕 ID 需加上 ContentPlaceHolderID$ 前綴:
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master"
AutoEventWireup="true" CodeFile="login.aspx.cs" Inherits="login" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<asp:TextBox runat="server" ID="wd" />
<asp:Button ID="btsubmit" runat="server" Text="提交" OnClick="btsubmit_Click" />
</asp:Content>
protected void Page_Load(object sender, EventArgs e)
{
this.Form.DefaultButton = "ContentPlaceHolder1$btsubmit";
}
protected void Page_Load(object sender, EventArgs e)
{
this.Page.Form.DefaultButton = "ContentPlaceHolder1$btsubmit";
}
protected void Page_Load(object sender, EventArgs e)
{
this.Form.DefaultButton = "btsubmit";
}
Form.DefaultButton 或 UseSubmitBehavior="false",標準、無腳本相依。onkeydown 攔截。UniqueID(含 ContentPlaceHolderID$ 前綴)。!IsPostBack 避免重複執行載入邏輯。掌握上述機制,即能輕鬆駕馭 ASP.NET 中的 Enter 鍵提交行為,提升表單操作體驗。