最近,在公司做項目的時候,遇見一件很有意思的事情。有這樣一個需求:A頁面有一個文本框,一個asp:Button,我們在文本框中輸入內容后,按回車鍵,然后跳轉到B頁面(當然頁面還有其他控件)。奇怪的是,斷點調試顯示此時已經觸發了事件,但是就是不能跳轉到B頁面,更奇怪的是連續點擊Enter鍵兩次,才能夠跳轉到B頁面。公司的同事一時也沒能夠解決,於是,本着學習的態度,研究如何設置制定按鈕為希望響應回車的真正按鈕。
這里,我就從form表單提交事件聊起。
在html頁面中,如果我們需要把一個A頁面的數據,提交到B頁面,我們會這樣寫
<form action="B.htm" method="get">
<input type="text" name="txtName" />
<input id="btnSure" type="submit" value="確認" />
</form>
此時,默認回車鍵是btnSure。
那么,如何使用普通的button,設定回車觸發事件呢?因為Enter鍵的ASCII碼是13,且唯一,這個完全可以利用,代碼如下。
<body onkeypress="GoURLB()">
<input type="text" name="txtName" />
<input id="btnSure" type="button" value="確認" />
</body>
js函數如下
<script type="text/javascript"> function GoURLB() { if (event.keyCode == 13) { window.open("B.htm", "_self"); } } </script>
由此,可見,在body中添加onkeypress可以完美解決這個問題。
那么現在回到主題中來,asp.net的aspx頁面如何設置Enter觸發事件呢。如果回答這個問題,需要回到控件渲染的問題了,因為渲染過程比較復雜,以后再談。這里說的比較簡單點。
當我們新建一個aspx頁面,往頁面里面拖拽一個asp:Button按鈕,運行於瀏覽器中,然后查看源代碼,我們可以清晰的看到,我們的這個Button,不是被渲染成<input type="button" id="btnSure" value="確認">,而是被渲染成<input type="submit" name="btnSure" value="確認" id="btnSure" />,截個圖如下
看見了吧,在紅線1處,就是渲染成的Html代碼,因此,如果一個頁面上只有一個Button,那么肯定是默認的Enter鍵觸發者了。其次,請注意划紅線2的地方,已然多了 method="post" aciton="WebForm2.aspx",aciton的url正是本頁面的URL,因此,為什么一個Button會有回發事件了,原因很簡單:點擊一次,就提交數據到本頁面一次。在Jsp頁面中,我們使用form表單,常常會指定一個Servlet,將數據發送到Servlet,讓其進行處理,最后將處理后的數據再發回指定的頁面,可能是本頁面,也可能是其他頁面。而WebForm頁面的action似乎不夠指定其他頁面。
如果我們有時候希望讓asp:Button 呈現普通的button形式,如果做到呢,so easy,代碼如下
<asp:Button ID="btnSure" UseSubmitBehavior="false" runat="server" Text="確認" />
此時,呈現的便是<input type="button">了,似乎沒有太多的意義。
那么,如何設置制定按鈕為希望響應回車的真正按鈕呢,很簡單,代碼如下
<form id="form1" runat="server" defaultbutton="btnFirst"> <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
<asp:Button ID="btnFirst" runat="server" Text="Button" OnClientClick="CheckFirst()" /> <asp:Button ID="btnSecond" runat="server" Text="Button" OnClientClick="CheckSecond()" /> </form>
我們只需要在form中將制定按鈕的Id賦值給defaultbutton就行了,很簡單,是吧,可是,有時候,在前台頁面制定了,事件是觸發了,卻不能達到理想的效果,就如同我前面說到的一種情況,這時候怎么辦呢??微軟真是考慮周到了,前台不行,我們后台制定,如何制定,只需要一行代碼,代碼如下
Page.Form.DefaultButton = "指定控件的ID";
這段代碼本人一般寫在Page_Load事件里,效果挺好的,上面的問題也很好的解決了。注意細節:如果你的控件放在masterPage里面,請注意控件的真正ID是什么,因為此時的ID會被渲染成另外一種格式,據說微軟是為了防范用戶在同一個頁面里面有兩個ID相同的控件。當然如果我們使用的net 4.0,可以將控件的一個屬性ClientIDMode設置成Static,這樣控件的ID無論套了多少母板頁,ID值都不會變,都是我們指定的ID,當然,ID的唯一性就得我們程序員去控制了。
看起來挺簡單的,但是也挺有意思的。