ASP.NET頁面——視圖狀態
從運行的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">
推薦閱讀:
※URL Rewriting in ASP.NET
※使用Jexus實現ASP.NET在Linux平台下的部署
※【譯】.NET Core 路線圖
※IIS asp.net 註冊。 為什麼Framework 3.5為什麼在IIS的ASP.NET選項找不到?
※安裝 .NET Framework的技巧以及探究路徑