国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

ASP.NET Button控件的UseSubmitBehavior屬性引發的血案

2019-11-17 01:40:45
字體:
來源:轉載
供稿:網友

asp.net Button控件的UseSubmitBehavior屬性引發的血案

這里先不說標題上的UseSubmitBehavior屬性是什么,先說下面這種情況。

通常,在我們寫一個表單頁面的時候,最下方會有“提交”和“返回”字樣的兩個按鈕。顧名思義,它們的功能大家都知道,但是一般情況下我們會給表單的內容加上一些驗證,這樣就出現了一個問題。因為兩個按鈕是服務器控件(有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方法實現頁面跳轉。

我相信很多朋友都是這么寫的吧?反正能解決問題就行。為什么?往下看。

但是今天無意中發現了Button.UseSubmitBehavior這個屬性,將其置成false,會使“返回”按鈕“躲避”掉表單驗證,直接執行點擊事件中的方法。這正是我們一直以來想要的不是么?而且按鈕還很統一,不用去加額外的js代碼。

這里要說明一下,大家不要以為Button.UseSubmitBehavior真的是用來“躲避”驗證的,我只是用這個詞來表達一下它實現的效果。實際上Button控件有專門的屬性是用來屏蔽驗證控件的。就是Button.CausesValidation,通過名字我們應該就能了解一二。

那你會不會問,“既然有這個屬性,以上問題就不算是問題啦,可以很容易的解決。”

我想說,“是這樣的啊!”但前提是,你的項目中只存在后臺驗證。但是現實中我覺得不會所有人都這樣做吧?反正我就蠻習慣用jQuery.validate驗證插件的(前臺驗證)。那我們繼續研究Button.UseSubmitBehavior吧。

看個例子:

前臺代碼:

<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

可以看出重點就是圖里指出的兩個機制:

1、客戶端瀏覽器的提交機制

2、ASP.NET 回發機制

解釋一下,有錯誤的話請大家指正

1、大家可以看下這個鏈接所講的第一部分:http://www.th7.cn/PRogram/net/201309/150415.shtml

就是瀏覽器會封裝一個請求報文,發給服務器,服務器解析這個報文,進行重組,生成一個響應報文,回發給瀏覽器,瀏覽器收到后再對其進行解析,就生成了我們看到的網頁和一些我們看不到的數據。它們之間的通信都是遵循HTTP協議。

重點強調:HTTP是無狀態協議,也就是說每次的瀏覽器請求,服務器響應都是全新的一次。

2、大家可以看下這個鏈接所講的內容: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";        }    }

操作步驟:

1、初始頁面

2、先連續點擊browser-server按鈕三次

3、再連接點擊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.VEVb.com/zhouhongyu1989/UseSubmitBehavior%E7%A4%BA%E4%BE%8BDemo.rar


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 萨嘎县| 滁州市| 尼木县| 滨州市| 镇安县| 宁阳县| 汉中市| 瑞丽市| 武清区| 定襄县| 宝坻区| 金川县| 临清市| 来凤县| 益阳市| 休宁县| 聂拉木县| 新疆| 沙田区| 冀州市| 浪卡子县| 恭城| 三门峡市| 通辽市| 南召县| 元谋县| 锡林郭勒盟| 双鸭山市| 昌都县| 迭部县| 申扎县| 河南省| 漳浦县| 太仓市| 神池县| 萝北县| 亚东县| 淮南市| 元阳县| 志丹县| 屏东市|