從運行的ASP.NET應用程序中,首先注意的是頁面的會送功能。這對於開發人員真的是一個好處,開發人員不用手動保存服務器的每次往返之間的信息。ASP.NET為服務的服務器控件(服務器控件使用runat=’”server”屬性指定)提供視圖狀態。當ASP.NET為HTML的形式呈現頁面時,它創建一個隱藏的窗體字段,成為_ViEWSTATE。這個字段是一個加密的、標記化得字符串(可以通過工具ViewStateDecoder查看,可以到網上下載),包含ASP.NET頁面上每個控件的名/值對。每個控件存儲的值實際上時控件關聯的值和狀態信息。當頁面被發送到服務器是,ASP.NET可以輕松地使用這些值並重新構建頁面控件,控件的值和狀態,不用開發人員編寫代碼。
創建一個ASP.NET頁面PageViewStateDemo.aspx實現一個文本框,兩個按鈕實現文本框的隱藏和顯示,以說明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>
后台代碼很簡單:
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:
點擊Hide按鈕再看源代碼:
可以看到ViewState的值不一樣了:
ViewState在開發Web頁面是確實可以節約時間。但是,它有性能成本。在上面的例子可以看出,對服務器控件的一個屬性的最輕微的修改也會改變視圖狀態的大小。在頁面中添加10到20個簡單的服務器控件,和幾個高級的服務器控件,可以看到呈現HTML的大小可以變成應用程序的一個瓶頸,尤其是對於帶寬有限的用戶來說。
為了提高ASP.NET應用程序的性能,必須得控制服務器控件的使用以降低呈現的HTML的大小。控制服務器控件的手段就是在不需要服務器的代碼執行期間在不需要與控件交互時使用靜態的HTML控件。
對一個正常的HTML控件使用runat=“server”屬性,它就可以從服務器端的代碼中訪問,並且和ASP.NET服務器控件具有相同的性能損失。
禁用ViewState的方式有:
1、禁用控件的ViewState
<asp:TextBox ID="TextBox1" EnableViewState="false" runat="server"></asp:TextBox>
設置TextBox1的ASP.NET文本框在視圖狀態中不再保存任何信息。但不會影響頁面中其他控件或頁面本身的ViewState信息。
2、禁用頁面的ViewState
<%@ Page Language="C#" AutoEventWireup="true" EnableViewState="false" %>
禁用用戶控件的ViewState跟禁用頁面的ViewState類型也是設置其EnableViewState="false" 。
3、禁用應用程序的ViewState
<pages enableViewState="false">
viewstateDecoder下載:http://files.cnblogs.com/lixinkun/ViewStateDecoder2.0-viewstatus%E6%9F%A5%E7%9C%8B.exe.zip