這裏先不說標題上的UseSubmitBehavior屬性是什麼,先說下面這種狀況。html
一般,在咱們寫一個表單頁面的時候,最下方會有「提交」和「返回」字樣的兩個按鈕。顧名思義,它們的功能你們都知道,可是通常狀況下咱們會給表單的內容加上一些驗證,這樣就出現了一個問題。由於兩個按鈕是服務器控件(有runat=」Server」屬性),因此點擊按鈕以後會先進行驗證(不管這裏你用的是前臺的jQuery.validate驗證或者是ASP.NET自帶的後臺驗證控件驗證,都會先進行驗證)。對於「提交」按鈕,這確實是咱們想要的,可是對於「返回」按鈕,咱們並不想出現這種狀況,而是想讓它不通過驗證,直接跳轉回上一頁。數據庫
對於這種狀況,我之前的解決方法就是把瀏覽器
<asp:Button ID="button_back" runat="server" Text="back" OnClick="button_back_Click" />
換成服務器
<input type="button" value="back" onclick="BackToPage();" />
這種形式。BackToPage方法實現頁面跳轉。工具
我相信不少朋友都是這麼寫的吧?反正能解決問題就行。爲何?往下看。post
可是今天無心中發現了Button.UseSubmitBehavior這個屬性,將其置成false,會使「返回」按鈕「躲避」掉表單驗證,直接執行點擊事件中的方法。這正是咱們一直以來想要的不是麼?並且按鈕還很統一,不用去加額外的js代碼。學習
這裏要說明一下,你們不要覺得Button.UseSubmitBehavior真的是用來「躲避」驗證的,我只是用這個詞來表達一下它實現的效果。實際上Button控件有專門的屬性是用來屏蔽驗證控件的。就是Button.CausesValidation,經過名字咱們應該就能瞭解一二。spa
那你會不會問,「既然有這個屬性,以上問題就不算是問題啦,能夠很容易的解決。」插件
我想說,「是這樣的啊!」但前提是,你的項目中只存在後臺驗證。可是現實中我以爲不會全部人都這樣作吧?反正我就蠻習慣用jQuery.validate驗證插件的(前臺驗證)。那咱們繼續研究Button.UseSubmitBehavior吧。code
看個例子:
前臺代碼:
<asp:Button ID="button_confirm" runat="server" Text="肯定" /> <asp:Button ID="button_back" runat="server" Text="返回" onclick="button_back_Click" />
瀏覽器中查看源碼中的形式
前臺代碼:
<asp:Button ID="button_confirm" runat="server" Text="肯定" /> <asp:Button ID="button_back" runat="server" Text="返回" UseSubmitBehavior="false" onclick="button_back_Click" />
瀏覽器中查看源碼中的形式
你們能夠看出加上UseSubmitBehavior屬性後,解析成的html語句明顯不一樣。看到這我才恍然大悟,當加過UseSubmitBehavior屬性以後,type屬性變成了button,這樣就跟以往的解決方法同樣了啊,由於不是submit屬性,因此也就不會觸發jQuery.validate的驗證方法(回答上面橙色加粗部分的爲何)。這就是爲何UseSubmitBehavior 置成false後,不用去進行前臺驗證的緣由。這就是謎底。
可是到這就結束了會不會以爲有些怪呢?咱們爲了達到咱們的目的,使用了一個新的屬性,可是這個屬性存在的意義並不是是爲了達到咱們的目的。
整理一下思緒,上面的例子咱們須要從腦殼裏抹去。UseSubmitBehavior屬性與是否觸發表單驗證徹底沒有任何關係。咱們來專一這個屬性的自己,畢竟這個是標題。
我很俗的查了一下MSDN
能夠看出重點就是圖裏指出的兩個機制:
一、客戶端瀏覽器的提交機制
二、ASP.NET 回發機制
解釋一下,有錯誤的話請你們指正
一、你們能夠看下這個連接所講的第一部分:http://www.th7.cn/Program/net/201309/150415.shtml
就是瀏覽器會封裝一個請求報文,發給服務器,服務器解析這個報文,進行重組,生成一個響應報文,回發給瀏覽器,瀏覽器收到後再對其進行解析,就生成了咱們看到的網頁和一些咱們看不到的數據。它們之間的通訊都是遵循HTTP協議。
重點強調:HTTP是無狀態協議,也就是說每次的瀏覽器請求,服務器響應都是全新的一次。
二、你們能夠看下這個連接所講的內容:http://blog.sina.com.cn/s/blog_7815564501012qgy.html 對於回發機制,我但願你們能跟着這篇文章裏講的步驟寫個小Demo試試,會更有感受。
回發機制,就是本身請求本身的頁面,這個機制比較搞,若是你們理解上一個機制,就會發現ASP.NET回發機制與其是有點背離的,上一個是無狀態的,這一個是能將前一次的值保存住,做爲下一次頁面的初值。
舉個實際中的例子,就是當咱們在填寫一個表單時,有好多好多項,可是當咱們填到倒數第二項的時候,不當心點擊了刷新,正常按第一個機制來講,表單內控件上的值應該所有被清空,由於此時尚未作數據庫讀取的操做,因此頁面不可能有值,可是有了回發機制,__viewstate把頁面保存了下來,這樣就保留下了咱們先前填寫的內容。不過技術羣裏的一個朋友說「如今這個東西已經不多會用了,基本不會用控件作項目開發。」囧rz啊~我一直都用的不亦樂乎,怎麼破?
兩個機制解釋完了,可能你們仍是有點一頭霧水,其實此時我也是同樣。下面寫個Demo讓整件事情變得更清晰點吧,借用一下Fiddler 這個工具。
頁面展現:
html代碼:
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server" method="post"> <div> <asp:Label ID="Label1" runat="server" Text="content:" ></asp:Label> <asp:TextBox ID="textbox_content" runat="server" width="500px"></asp:TextBox> <asp:Button ID="button_usesubmitbehavior_true" runat="server" Text="browser-server" onclick="button_usesubmitbehavior_true_Click" /> <asp:Button ID="button_usesubmitbehavior_false" runat="server" Text="postback" UseSubmitBehavior="false" onclick="button_usesubmitbehavior_false_Click" /> </div> </form> </body> </html>
頁面源碼:
後臺代碼:
public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { textbox_content.Text += "M"; } protected void button_usesubmitbehavior_true_Click(object sender, EventArgs e) { textbox_content.Text += "true"; button_usesubmitbehavior_true.Text += "1"; button_usesubmitbehavior_false.Text += "2"; } protected void button_usesubmitbehavior_false_Click(object sender, EventArgs e) { textbox_content.Text += "false"; button_usesubmitbehavior_true.Text += "3"; button_usesubmitbehavior_false.Text += "4"; } }
操做步驟:
一、初始頁面
二、先連續點擊browser-server按鈕三次
三、再鏈接點擊postback按鈕三次。
經過這個demo示例,若是單從頁面顯示上看,咱們徹底看不到二者有什麼不一樣,由於後臺想實現的功能二者都實現了(就是點擊一下按鈕,會通過一次page_load方法,而後再通過各自的click事件,給文本框和兩個按鈕追加內容)。可是利用fiddler工具,咱們會發現提交的表單內容的確是有些不同,UseSubmitBehavior屬性設爲false的按鈕提交時,自己沒有做爲表單的參數傳遞給服務器端。
這就是惟一的不一樣嗎?感受仍是不夠,不過我真的是寫不動了。
有興趣的朋友能夠再想一想別的對比示例,好比試試在page上加EnableViewState="false" 這個屬性,看看點擊完按鈕會是什麼效果的。這個我也有試,不過感受仍是不能證實什麼。
啊,最後終於想到了一個,你能夠給browser-server按鈕加上EnableViewState="false"屬性,嗯嗯,這個比較靠譜,給browser-server 按鈕加上EnableViewState="false"屬性 ,目的就是讓其沒有回發機制,由於Asp.Net控件默認都會有回發機制,這樣browser-server 按鈕就只有單純的客戶端瀏覽器的提交機制,而postback按鈕就只有回發機制。頁面效果異常明顯啊~
賣個關子,想看效果的朋友本身去試一下吧,你們能夠留言作交流,原諒我,這篇文章寫的屬實有點累。
總結一下,UseSubmitBehavior 這個屬性絕對能夠說是非主流的,花時間去研究會不會很蛋疼?
其實最初根本沒有想過這篇文章會寫這麼長,可是隨着研究這個屬性深刻,我去學習了ASP.NET的底層交互原理,ASP.NET頁面生命週期,回發機制以及瞭解了驗證相關的問題。說實話,收穫蠻多的,也很開心。固然,還要繼續實踐,學習。
附件的連接:http://files.cnblogs.com/zhouhongyu1989/UseSubmitBehavior%E7%A4%BA%E4%BE%8BDemo.rar