從運(yùn)行的ASP.NET應(yīng)用程序中,首先注意的是頁(yè)面的會(huì)送功能。這對(duì)于開發(fā)人員真的是一個(gè)好處,開發(fā)人員不用手動(dòng)保存服務(wù)器的每次往返之間的信息。ASP.NET為服務(wù)的服務(wù)器控件(服務(wù)器控件使用runat=’”server”屬性指定)提供視圖狀態(tài)。當(dāng)ASP.NET為HTML的形式呈現(xiàn)頁(yè)面時(shí),它創(chuàng)建一個(gè)隱藏的窗體字段,成為_ViEWSTATE。這個(gè)字段是一個(gè)加密的、標(biāo)記化得字符串(可以通過工具ViewStateDecoder查看,下載地址),包含ASP.NET頁(yè)面上每個(gè)控件的名/值對(duì)。每個(gè)控件存儲(chǔ)的值實(shí)際上時(shí)控件關(guān)聯(lián)的值和狀態(tài)信息。當(dāng)頁(yè)面被發(fā)送到服務(wù)器是,ASP.NET可以輕松地使用這些值并重新構(gòu)建頁(yè)面控件,控件的值和狀態(tài),不用開發(fā)人員編寫代碼。 創(chuàng)建一個(gè)ASP.NET頁(yè)面PageViewStateDemo.aspx實(shí)現(xiàn)一個(gè)文本框,兩個(gè)按鈕實(shí)現(xiàn)文本框的隱藏和顯示,以說明ViewState字段值是如何工作的。頁(yè)面代碼如下: <formid="form1"runat="server"> 后臺(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; } 在瀏覽器查看該頁(yè)面,在ASP.NET頁(yè)面返回后查看其源代碼: 利用剛才提到的ViewState查看工具ViewStateDecoder查看ViewState: 點(diǎn)擊Hide按鈕再看源代碼:
可以看到ViewState的值不一樣了:
ViewState在開發(fā)Web頁(yè)面是確實(shí)可以節(jié)約時(shí)間。但是,它有性能成本。在上面的例子可以看出,對(duì)服務(wù)器控件的一個(gè)屬性的最輕微的修改也會(huì)改變視圖狀態(tài)的大小。在頁(yè)面中添加10到20個(gè)簡(jiǎn)單的服務(wù)器控件,和幾個(gè)高級(jí)的服務(wù)器控件,可以看到呈現(xiàn)HTML的大小可以變成應(yīng)用程序的一個(gè)瓶頸,尤其是對(duì)于帶寬有限的用戶來(lái)說。 為了提高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ì)影響頁(yè)面中其他控件或頁(yè)面本身的ViewState信息。
2、禁用頁(yè)面的ViewState <%@ Page Language="C#" AutoEventWireup="true" EnableViewState="false" %>
禁用用戶控件的ViewState跟禁用頁(yè)面的ViewState類型也是設(shè)置其EnableViewState="false" 。 3、禁用應(yīng)用程序的ViewState <pages enableViewState="false"> |
|