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

首頁 > 編程 > .NET > 正文

asp.net viewstate 回發(fā)機制

2024-07-10 13:26:26
字體:
來源:轉載
供稿:網(wǎng)友
所謂回發(fā)機制,其實說白了就是自己發(fā)送給自己(本頁面)而已。下面我們新建一個網(wǎng)站,打開默認添加的Default.aspx頁面,form部分代碼如下:

復制代碼 代碼如下:


<form runat="server" >
<div>
</div>
</form>


  下面是運行頁面后的HTML代碼:

復制代碼 代碼如下:


<form method="post" action="Default.aspx">
<div>
<input type="hidden" value="/wEPDwUJNzgzNDMwNTMzZGSWiVUOl9W4QUXb+tXv2k5s4yXFog==" />
</div>
<div>
</div>
</form>


  我們可以看到原本空蕩蕩的form表單內變得豐富起來,首先發(fā)生變化的就是form表單自身,<form runat="server" >被解釋成了<form method="post" action="Default.aspx">,自動的給form1這個表單增加了action和method屬性,method默認為post,action則指向頁面本身。另外一個發(fā)生變化的就是form1表單中增加了一個id="__VIEWSTATE" 的隱藏域,這就是我們要討論的ViewState
  我們再舉一個例子:這時,我們向頁面中添加一個Label一個TextBox還有一個Button代碼如下:

復制代碼 代碼如下:


<form runat="server" >
<div>
<asp:Label runat="server" Text="Label"></asp:Label><br />
<asp:TextBox runat="server"></asp:TextBox><br />
<asp:Button runat="server" Text="Button"/>
</div>
</form>


  然后在Button1_Click中寫如下代碼:

復制代碼 代碼如下:


protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text += "你好";
TextBox1.Text += "你好";
}


  好了,現(xiàn)在我們來給Button1增加一些點擊量,可以看到,Label控件和TextBox控件隨著我們點擊量的提高,其內容也在不斷的變化,這種情況在Winform中非常常見,也很容易理解,可是ASP.NET是基于HTTP協(xié)議的,而HTTP協(xié)議是無狀態(tài)協(xié)議。也就是說,服務器有健忘癥,明明不久前剛剛給他發(fā)出過請求,創(chuàng)建了一個page對象,并做出響應。但是第二次請求到達的時候,服務器已經(jīng)不認識你了(服務器會創(chuàng)建一個全新的page對象,和之前那個沒有任何關系,再次給出響應)。在這種服務器有健忘癥的惡劣條件下,要達到Winform一樣的效果,真不是一件簡單的事情。
  我們給預編譯指令Page增加一個屬性EnableViewState="false"(禁用ViewState)之后,再重新運行頁面,繼續(xù)連續(xù)點擊Button1,看這下是什么效果?大家會發(fā)現(xiàn)Label控件效果沒有變化,但是TextBox控件內容卻還在繼續(xù)發(fā)生著變化。這是什么原因呢?其實我們只要查看一下源代碼就會發(fā)現(xiàn):

復制代碼 代碼如下:


<div>
<span>Label</span><br />
<input type="text" /><br />
<input type="submit" value="Button" />
</div>


  3個控件分別變成了span,文本框(text)和提交按鈕(submit),當我們點擊Button1時HTML會將要提交的表單中的所有表單控件的name和value屬性用“&”連接成name=value的字符串,然后向action指向的頁面,method指定的方式,發(fā)送請求。我們可以將<form runat="server" >表單的發(fā)送方式修改為get(<form runat="server" method="get">)再點擊提交,就可以注意到地址欄的變化了。
  由于Label控件最終生成的標簽是span,但是表單在提交時,不會提交span標簽中的value,但是卻會提交input中的value,所以服務器可以得到input最新的value,而由于沒有發(fā)送span的value,所以服務器無法得到span最新的修改。這就是為什么當禁用ViewState時,Label不會變化,而input還是會發(fā)生變化的原因了。要解決這個問題,asp.net引入了ViewState,其實ViewState就是一個hidden隱藏域而已。表單不會發(fā)送span標記的value但是卻會發(fā)送hidden控件的value,于是asp.net在給span標記賦值的時候,再給這個名叫ViewState的hidden控件記錄一份,這樣服務器就可以從hidden中獲得Label標簽原來的內容了。
  這就是ViewState的本質,當然在服務器端還有LoadViewState和SaveViewState方法,夜深了,就不再多說了。這是小弟的第一篇博文,斗膽放入首頁,希望大家能夠以鼓勵為主,拍磚為輔!謝謝謝謝
  還要感謝譚兄,那本《道不遠人--深入ASP.NET控件開發(fā)》讓我獲益良多。
asp.net 去除viewstate
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 曲靖市| 唐海县| 忻城县| 宣恩县| 枣庄市| 灯塔市| 郯城县| 积石山| 芦溪县| 雷州市| 乌兰县| 稷山县| 萝北县| 宜春市| 北海市| 若尔盖县| 元朗区| 大理市| 郎溪县| 吉林市| 荔波县| 蒲城县| 自贡市| 济宁市| 龙口市| 甘孜县| 绥德县| 潼关县| 特克斯县| 中江县| 万州区| 高要市| 岳阳县| 岳西县| 法库县| 芦山县| 台北县| 临海市| 织金县| 白玉县| 六枝特区|