視圖狀態是 ASP.NET 頁框架默認情況下用於保存往返過程之間的頁和控件值的方法。當呈現頁的 HTML 形式時,需要在回發過程中保留的頁的當前狀態和值將被序列化為 Base64 編碼的字符串,並輸出到視圖狀態的隱藏字段中。
視圖狀態是 ASP.NET 頁中的儲存庫,可以存儲需要在回發過程中保留的值。例如,您可以將信息存儲在視圖狀態中,下次將頁面發送到服務器時,將會在頁加載事件過程中訪問這些信息。
您可以使用頁的 ViewState 屬性(此屬性公開一個字典對象)來訪問視圖狀態信息。由於視圖狀態數據以字符串的形式存儲,因此只能存儲可以序列化的對象。
視圖狀態數據以 Base64 編碼字符串的格式存儲在一個或多個隱藏字段中。您可以使用頁的 ViewState 屬性(此屬性公開一個字典對象)來訪問視圖狀態信息。由於視圖狀態數據以字符串的形式存儲,因此只能存儲可以序列化的對象。
由於視圖狀態是作為隱藏字段發送的,因此直到發生 PreRenderComplete 事件之前,都可以對視圖狀態進行更改。一旦將頁呈現到浏覽器,便無法保存對視圖狀態的更改。
如果查看頁輸出源,則可以看到隱藏視圖狀態字段中的信息,這可能產生安全性問題。若要緩解該問題,可以通過將 @ Page 指令中的 viewStateEncryptionMode 屬性設置為“Always”來加密視圖狀態。
注意
若要使用 ViewState 屬性,ASP.NET 網頁必須包含具有 runat="server" 屬性的窗體元素。
可以存儲在視圖狀態中的數據類型
您可以將下列類型的對象存儲到視圖狀態中:
字符串
整數
布爾值
Array 對象
ArrayList 對象
哈希表
自定義類型轉換器(請參見 TypeConverter 類)
您也可以存儲其他類型的數據,但是必須使用 Serializable 屬性編譯該類,這樣視圖狀態便可以將這些數據序列化為 XML。
使用視圖狀態的注意事項
視圖狀態提供了特定 ASP.NET 頁的狀態信息。如果需要在多個頁上使用信息,或者如果需要在訪問網站時保留信息,則應當使用另一個方法(如應用程序狀態、會話狀態或個性化設置)來維護狀態。
視圖狀態信息將序列化為 XML,然後使用 Base64 編碼進行編碼,這將生成大量的數據。將頁回發到服務器時,視圖狀態的內容將作為頁回發信息的一部分發送。如果視圖狀態包含大量信息,則會影響頁的性能。
另一個重要的考慮因素是,如果隱藏字段中的數據量過大,某些代理和防火牆將禁止訪問包含這些數據的頁。由於最大數量會隨所采用的防火牆和代理的不同而不同,因此大量隱藏字段可能會導致偶發性問題。為了幫助避免這一問題,如果 ViewState 屬性中存儲的數據量超過了頁的 MaxPageStateFieldLength 屬性中指定的值,該頁會將視圖狀態拆分為多個隱藏字段,以將每個單獨字段的大小減少到防火牆拒絕的大小以下。
某些移動設備根本不允許使用隱藏字段。因此,視圖狀態對於這些設備無效。