從運(yùn)行的ASP.NET應(yīng)用程序中,首先注意的是頁面的會(huì)送功能。這對(duì)于開發(fā)人員真的是一個(gè)好處,開發(fā)人員不用手動(dòng)保存服務(wù)器的每次往返之間的信息。ASP.NET為服務(wù)的服務(wù)器控件(服務(wù)器控件使用runat=’”server”屬性指定)提供視圖狀態(tài)。當(dāng)ASP.NET為HTML的形式呈現(xiàn)頁面時(shí),它創(chuàng)建一個(gè)隱藏的窗體字段,成為_ViEWSTATE。這個(gè)字段是一個(gè)加密的、標(biāo)記化得字符串(可以通過工具ViewStateDecoder查看,可以到網(wǎng)上下載),包含ASP.NET頁面上每個(gè)控件的名/值對(duì)。每個(gè)控件存儲(chǔ)的值實(shí)際上時(shí)控件關(guān)聯(lián)的值和狀態(tài)信息。當(dāng)頁面被發(fā)送到服務(wù)器是,ASP.NET可以輕松地使用這些值并重新構(gòu)建頁面控件,控件的值和狀態(tài),不用開發(fā)人員編寫代碼。
創(chuàng)建一個(gè)ASP.NET頁面PageViewStateDemo.aspx實(shí)現(xiàn)一個(gè)文本框,兩個(gè)按鈕實(shí)現(xiàn)文本框的隱藏和顯示,以說明ViewState字段值是如何工作的。
頁面代碼如下:
<formid="form1"runat="server">
<div><br/><br/><br/><br/>
</div>
<divstyle="display:inline; z-index:101; left:16px; width:70px; position:absolute;
top:25px; height:15px">Test Field</div>
<asp:TextBoxID="txtName"style="z-index:106; left:101px; position:absolute;
top:23px"runat="server"></asp:TextBox>
<asp:ButtonID="btnHide"
style="z-index:111; left:15px; position:absolute; top:59px;"runat="server"
Width="61px"Text="Hide"onclick="btnHide_Click" />
<asp:ButtonID="btnShow"
style="z-index:112; left:95px; position:absolute; top:59px;"runat="server"
Width="61px"Text="Show"onclick="btnShow_Click" />
</form>
后臺(tái)代碼很簡(jiǎn)單:
protected void btnHide_Click(object sender, EventArgs e) { this.txtName.Visible = false; } protected void btnShow_Click(object sender, EventArgs e) { this.txtName.Visible = true; }
在瀏覽器查看該頁面,在ASP.NET頁面返回后查看其源代碼:
利用剛才提到的ViewState查看工具ViewStateDecoder查看ViewState:
點(diǎn)擊Hide按鈕再看源代碼:
可以看到ViewState的值不一樣了:
ViewState在開發(fā)Web頁面是確實(shí)可以節(jié)約時(shí)間。但是,它有性能成本。在上面的例子可以看出,對(duì)服務(wù)器控件的一個(gè)屬性的最輕微的修改也會(huì)改變視圖狀態(tài)的大小。在頁面中添加10到20個(gè)簡(jiǎn)單的服務(wù)器控件,和幾個(gè)高級(jí)的服務(wù)器控件,可以看到呈現(xiàn)HTML的大小可以變成應(yīng)用程序的一個(gè)瓶頸,尤其是對(duì)于帶寬有限的用戶來說。
為了提高ASP.NET應(yīng)用程序的性能,必須得控制服務(wù)器控件的使用以降低呈現(xiàn)的HTML的大小?刂品⻊(wù)器控件的手段就是在不需要服務(wù)器的代碼執(zhí)行期間在不需要與控件交互時(shí)使用靜態(tài)的HTML控件。
對(duì)一個(gè)正常的HTML控件使用runat=“server”屬性,它就可以從服務(wù)器端的代碼中訪問,并且和ASP.NET服務(wù)器控件具有相同的性能損失。
禁用ViewState的方式有:
1、禁用控件的ViewState
<asp:TextBox ID="TextBox1" EnableViewState="false" runat="server"></asp:TextBox>
設(shè)置TextBox1的ASP.NET文本框在視圖狀態(tài)中不再保存任何信息。但不會(huì)影響頁面中其他控件或頁面本身的ViewState信息。
2、禁用頁面的ViewState
<%@ Page Language="C#" AutoEventWireup="true" EnableViewState="false" %>
禁用用戶控件的ViewState跟禁用頁面的ViewState類型也是設(shè)置其EnableViewState="false" 。
3、禁用應(yīng)用程序的ViewState