最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

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

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:43:16
文檔

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

asp.net viewstate 回發(fā)機(jī)制:所謂回發(fā)機(jī)制,其實(shí)說(shuō)白了就是自己發(fā)送給自己(本頁(yè)面)而已。下面我們新建一個(gè)網(wǎng)站,打開(kāi)默認(rèn)添加的Default.aspx頁(yè)面,form部分代碼如下: 代碼如下:<form id=form1 runat=server > <div> </div> </f
推薦度:
導(dǎo)讀asp.net viewstate 回發(fā)機(jī)制:所謂回發(fā)機(jī)制,其實(shí)說(shuō)白了就是自己發(fā)送給自己(本頁(yè)面)而已。下面我們新建一個(gè)網(wǎng)站,打開(kāi)默認(rèn)添加的Default.aspx頁(yè)面,form部分代碼如下: 代碼如下:<form id=form1 runat=server > <div> </div> </f

所謂回發(fā)機(jī)制,其實(shí)說(shuō)白了就是自己發(fā)送給自己(本頁(yè)面)而已。下面我們新建一個(gè)網(wǎng)站,打開(kāi)默認(rèn)添加的Default.aspx頁(yè)面,form部分代碼如下:

代碼如下:

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

  下面是運(yùn)行頁(yè)面后的HTML代碼:
代碼如下:

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

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

代碼如下:

<form id="form1" runat="server" >
<div>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><br />
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br />
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click"/>
</div>
</form>

  然后在Button1_Click中寫如下代碼:
代碼如下:

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

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

<div>
<span id="Span1">Label</span><br />
<input name="TextBox1" type="text" id="Text1" /><br />
<input type="submit" name="Button1" value="Button" id="Submit1" />
</div>

  3個(gè)控件分別變成了span,文本框(text)和提交按鈕(submit),當(dāng)我們點(diǎn)擊Button1時(shí)HTML會(huì)將要提交的表單中的所有表單控件的name和value屬性用“&”連接成name=value的字符串,然后向action指向的頁(yè)面,method指定的方式,發(fā)送請(qǐng)求。我們可以將<form id="form1" runat="server" >表單的發(fā)送方式修改為get(<form id="form1" runat="server" method="get">)再點(diǎn)擊提交,就可以注意到地址欄的變化了。
  由于Label控件最終生成的標(biāo)簽是span,但是表單在提交時(shí),不會(huì)提交span標(biāo)簽中的value,但是卻會(huì)提交input中的value,所以服務(wù)器可以得到input最新的value,而由于沒(méi)有發(fā)送span的value,所以服務(wù)器無(wú)法得到span最新的修改。這就是為什么當(dāng)禁用ViewState時(shí),Label不會(huì)變化,而input還是會(huì)發(fā)生變化的原因了。要解決這個(gè)問(wèn)題,asp.net引入了ViewState,其實(shí)ViewState就是一個(gè)hidden隱藏域而已。表單不會(huì)發(fā)送span標(biāo)記的value但是卻會(huì)發(fā)送hidden控件的value,于是asp.net在給span標(biāo)記賦值的時(shí)候,再給這個(gè)名叫ViewState的hidden控件記錄一份,這樣服務(wù)器就可以從hidden中獲得Label標(biāo)簽原來(lái)的內(nèi)容了。
  這就是ViewState的本質(zhì),當(dāng)然在服務(wù)器端還有LoadViewState和SaveViewState方法,夜深了,就不再多說(shuō)了。這是小弟的第一篇博文,斗膽放入首頁(yè),希望大家能夠以鼓勵(lì)為主,拍磚為輔!謝謝謝謝
  還要感謝譚兄,那本《道不遠(yuǎn)人--深入ASP.NET控件開(kāi)發(fā)》讓我獲益良多。
asp.net 去除viewstate

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

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

asp.net viewstate 回發(fā)機(jī)制:所謂回發(fā)機(jī)制,其實(shí)說(shuō)白了就是自己發(fā)送給自己(本頁(yè)面)而已。下面我們新建一個(gè)網(wǎng)站,打開(kāi)默認(rèn)添加的Default.aspx頁(yè)面,form部分代碼如下: 代碼如下:<form id=form1 runat=server > <div> </div> </f
推薦度:
標(biāo)簽: vi 回發(fā) 機(jī)制
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top