為Web頁面及其控件保持狀態信息是非常有必要的。然而,由於Web應用程序創建於HTTP協議的頂層,這是一個無狀態的協議,因此,保持狀態信息則變得非常困難。為了解決這個問題,ASP.NET 2.0技術提供了多種解決方案,例如,利用Session、CookIE、視圖狀態、控件狀態、隱藏域、查詢字符串、個性化用戶配置(Profile)等等。對於利用ASP.Net 2.0技術創建服務器控件而言,保持狀態信息也是非常重要的,其主要解決途徑是利用視圖狀態和控件狀態。本文詳細講解了視圖狀態(VIEwState)的基本知識,並通過典型應用介紹視圖狀態的應用方法。
視圖狀態概述 視圖狀態是一項非常重要的技術,它能使得頁面和頁面中的控件在從服務器到客戶端,再從客戶端返回的往返過程中保持狀態信息。這樣就可以在Web這種無狀態的環境之上創建一個有狀態並持續執行的頁面效果。本節主要介紹有關視圖狀態的運行機制、應用方法、存儲的數據類型、性能和安全性、視圖狀態分塊(這是ASP.Net 2.0的新特性)和優缺點等內容。
(1)運行機制
視圖狀態的具體運行過程為:每當用戶請求某個.ASPx頁面時,.NET框架首先把相關控件的狀態數據序列化成一個字符串,然後,將其做為名為__VIEWSTATE的隱藏域的Value值發送到客戶端。如果頁面是第一次被請求,那麼服務器控件也將是被第一次執行時,名為__VIEWSTATE的隱藏域中只包含控件的默認信息,通常為空或者null。在隨後的回送事件中,VIEwState中就保存了服務器控件在前面回送中可用的屬性狀態。這樣服務器控件就可以監視在當前被處理的回送事件發生之前的狀態了。這些過程是由.Net框架負責的,對用戶來說是執行.ASPx頁面就有了持續執行的效果。
(2)存儲的數據類型
視圖狀態可以存儲多種類型的數據,並且為了提高運行效率,視圖狀態自身還包括一套已經優化的針對常用類型的序列化方式。視圖狀態序列化方式默認支持的數據類型包括以下幾種:String、Int32、Unit、Color、Array、ArrayList、HashTable和自定義類型轉換器TypeConverter。
視圖狀態已經為Array、ArrayList和包含上面列出類型的HashTable對象進行了優化。因此,當在控件中使用視圖狀態時,應該試著限定於使用以上簡單數據類型,以及經過優化的類型。在此,需要重點說明一下自定義類型轉換器TypeConverter,它提供了一種將值的類型轉換為其他類型以及訪問標准值和子屬性的統一方法。例如,可以利用TypeConverter將字符串轉換為數值,或者將數值轉換為字符串。如果沒有類型轉換器,那麼頁面框架會使用.Net框架提供的二進制序列化功能來序列化對象,這個過程是非常耗費資源的。
(3)性能和安全性
使用視圖狀態時,對象必須先序列化,然後再通過回傳進行反序列化。因此,我們必須了解有關ViewState性能的內容。默認情況下,控件的ViewState將被啟用,如果不需要使用ViewState,最好還是將它關閉。以下情況將不再需要VIEwState:(1)控件未定義服務器端事件(這時的控件事件均為客戶端事件且不參加回送的);(2)控件沒有動態的或數據綁定的屬性值。關閉視圖狀態的方法是將控件的EnableViewState的值設置為"false",即EnableVIEwState="false"。
默認情況下,視圖狀態的有關內容在編譯運行發送給客戶端時,讀者將在頁面的Html代碼中看到__VIEWSTATE隱藏域內容。這是一些沒有意義的字符串,是.NET框架通過Base64位編碼對相關內容編碼的結果。它們是通過明文方式在客戶端和服務器端之間往返傳送。在某些情況下,例如涉及密碼、賬號、連接字符串等敏感內容時,使用默認方式是很不安全的。為此,.Net框架為VIEwState提供了兩種安全機制:
· 校驗機制:
可以通過設置EnableViewStateMac="true"屬性來指示.NET框架向ViewState數據中追加一個散列碼(該散列碼是一種SHA1類型,長度有160位,因此會嚴重影響執行性能)。在回傳事件發生時,將重新建立該散列碼,它必須和最初的散列碼匹配。通過這種方式,能夠有效檢驗VIEwState是否在傳送過程中能夠被篡改。默認情況下,.Net框架使用SHA1算法來生成VIEwState散列代碼。此外,也可以通過在machine.config文件中設置<machineKey>來選擇 MD5 算法,如下所示:<MachineKey validation="MD5" />。MD5算法的性能要比SHA1算法好一些,但是同樣不夠安全。
· 加密機制
使用加密來保護ViewState字段中的實際數據值。首先,必須如上所述設置EnableVIEwStatMAC="true"。然後,將machineKey validation類型設置為3DES,即<MachineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="3DES" />,這指示ASP.Net使用3DES加密算法來加密VIEwState值。