1. 程式人生 > >ASP.Net中控制元件的EnableViewState屬性

ASP.Net中控制元件的EnableViewState屬性

在ASP.Net中對各個WebForm控制元件引入以前沒有的EnableViewState屬性。這個屬性究竟有什麼用。我們知道對於WebForm而言,其程式碼是在伺服器端的,以處理客戶端的請求。當用戶通過瀏覽器瀏覽網頁的時候,會對網頁進行某些操作,比如開啟新連結,或單擊某個按鈕。在ASP中,這些是通過指令碼語言對其進行處理,之後再傳遞給伺服器端。但是在ASP.NET下,由於採用了code behind技術,在coding的時候,通常是將以前客戶端完成的工作放到了伺服器端。

那麼,伺服器是怎麼知道客戶的操作的呢?比如我在文字框輸入的內容,或者單擊了登入按鈕,伺服器端是怎樣得到這些資訊的呢?因為沒有這些資訊,伺服器端就無法響應客戶的請求。原理就是ASP.NET引用了viewstate的機制。在伺服器端儲存了網頁各個控制元件及頁面的狀態,這其中包括各個控制元件在頁面上的佈局,和他們各自的屬性。這些值就儲存在ViewState下。我們可以觀察Aspx頁面的html原始碼,假設這個頁面上有一個button按鈕,和一個listBox控制元件,html檔案如下:

<input type="hidden" name="__VIEWSTATE" value="dDwzODYzNDM5NTU7Oz7FvviJbq45bDa7QJaumIiOhZ8mOQ==" />

 <input type="submit" name="Button1" value="Button" id="Button1" style="height:40px;width:96px;Z-INDEX: 101; LEFT: 200px; POSITION: absolute; TOP: 240px" />  <select name="ListBox1" size="4" id="ListBox1" style="width:152px;Z-INDEX: 102; LEFT: 176px; POSITION: absolute; TOP: 120px"></select>

我們它的不同之處,一是少了以前所必須響應客戶端事件的指令碼語言,一是多了一個名為”_VIEWSTATE”的屬性。其值是一長串字元。型別為“hidden”。這個值記錄的就是各個控制元件和頁面的狀態資訊。當用戶對頁面進行相關操作的時候,狀態值發生改變,並將改變的值傳遞給伺服器端。伺服器端在比較改變後的狀態值和初始值之間的區別,以響應具體的請求。

一旦頁面的控制元件很多,這種頻繁的傳遞控制元件狀態值對網路的消耗是很大的,因此,ASP.Net提供了EnableViewState屬性,系統預設的值為true。當設定為true時,在傳遞狀態值時就包括該控制元件;如果設定為false,則傳遞狀態值時則不包括它。既然狀態值不包括該控制元件,則客戶端對它進行的操作,伺服器端是不響應的。

我們可以做個實驗,在Button1_Click事件中,編寫程式碼:

ListBox.Items.Add(”客戶端點選按鈕一次!”);

此時執行該應用程式,單擊網頁上的按鈕,在ListBox中會新增內容,不斷地單擊,內容則不斷新增。如果我們將ListBox的EnableViewState屬性改為false時,不斷單擊按鈕,則只能新增一次。

這樣有什麼好處呢?如果我們在開發Web應用程式時,某些控制元件是不需要接受使用者的操作或只需要接受一次操作的時候,我們可以將這些控制元件的EnableViewState屬性改為false,這樣可以優化我們的程式,提高網路訪問的速度。