<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJMjgzMDgzOTgzZGRqBJ2DrJA0WVW8LiR3445iRDt1sg==" />
value保存了控件狀態和值,採用Base64編碼方式保存,大家可以從http://www.pluralsight.com/tools.aspx上下載Fritz Onion的ViewState解碼器ViewState Decoder (2.2)。具體的使用方法,自己下載下來使用,比較簡單。ViewState很容易進行解碼,因此敏感的信息最好不要保存在ViewState中。
在實際的項目中,我經常看到ViewState的長度有幾個屏幕的看不完的情況。如果遇到防火牆對POST請求值有最大尺寸限制的情況下,問題就會出現,常常會被防火牆拒絕。
這個時候,就需要我們採用合理的方法來處理ViewState,通常我們建議ViewState的大小不超過總頁面的30%。
1、分解ViewState
ASP.NET2.0開始在Page類中有MaxPageStateFieldLength屬性,以字節爲單位。這樣的話,如果ViewState的長度超過最大長度,就會自動分解成多個塊。ASP.NET1.1中還沒有這個功能,實現起來也沒有這麼方便,需要重寫LoadPageStateFromPersistenceMedium和SavePageStateToPersistenceMedium方法來實現。
ASP.NET的Page類包含兩個可以重寫的方法LoadPageStateFromPersistenceMedium 和SavePageStateToPersistenceMedium。在這些方法中,可以確定要對頁面的ViewState進行什麼處理。
SavePageStateToPersistenceMedium方法把ViewState對象作爲輸入,並可以用任意方式存儲它LoadPageStateFromPersistenceMedium方法必須從存儲位置加載以前的ViewState
2、壓縮ViewState
我們可以從icsharpcode.net上下載開源的SharpZipLib庫,來實現ViewState的壓縮和解壓縮。
3、把ViewState放到其他位置存儲
當ViewState超過20k,或者更大的時候。我們可以考慮把ViewState存儲到Session中,每個頁面有自己的GUID,這個GUID聲明作爲value值,根據GUID來設置和讀取ViewState的值。也可以通過重寫LoadPageStateFromPersistenceMedium和SavePageStateToPersistenceMedium方法來實現。
4、把ViewState移到頁面底部
通過重寫頁面的Render方法來實現。