ViewState

 ViewState的出現,使我們開發程序變得更加方便、快捷,但是它也使我們的程序變得臃腫。ViewState可以很方便的幫我們存儲控件的狀態和值(ASP.NET2.0有ControlState,專門來保存控件的狀態),當頁面以Html方式展現在我們面前的時候,ViewState是以一個隱藏控件的方式寫在Html中,如:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJMjgzMDgzOTgzZGRqBJ2DrJA0WVW8LiR3445iRDt1sg==" />

value保存了控件狀態和值,採用Base64編碼方式保存,大家可以從http://www.pluralsight.com/tools.aspx上下載Fritz OnionViewState解碼器ViewState Decoder (2.2)。具體的使用方法,自己下載下來使用,比較簡單。ViewState很容易進行解碼,因此敏感的信息最好不要保存在ViewState中。
       
在實際的項目中,我經常看到ViewState的長度有幾個屏幕的看不完的情況。如果遇到防火牆對POST請求值有最大尺寸限制的情況下,問題就會出現,常常會被防火牆拒絕。
       
這個時候,就需要我們採用合理的方法來處理ViewState,通常我們建議ViewState的大小不超過總頁面的30%
1、分解ViewState
ASP.NET2.0
開始在Page類中有MaxPageStateFieldLength屬性,以字節爲單位。這樣的話,如果ViewState的長度超過最大長度,就會自動分解成多個塊。ASP.NET1.1中還沒有這個功能,實現起來也沒有這麼方便,需要重寫LoadPageStateFromPersistenceMediumSavePageStateToPersistenceMedium方法來實現。

ASP.NETPage類包含兩個可以重寫的方法LoadPageStateFromPersistenceMedium SavePageStateToPersistenceMedium。在這些方法中,可以確定要對頁面的ViewState進行什麼處理。

SavePageStateToPersistenceMedium方法把ViewState對象作爲輸入,並可以用任意方式存儲它LoadPageStateFromPersistenceMedium方法必須從存儲位置加載以前的ViewState

2、壓縮ViewState
我們可以從icsharpcode.net上下載開源的SharpZipLib庫,來實現ViewState的壓縮和解壓縮。

3、把ViewState放到其他位置存儲
ViewState超過20k,或者更大的時候。我們可以考慮把ViewState存儲到Session中,每個頁面有自己的GUID,這個GUID聲明作爲value值,根據GUID來設置和讀取ViewState的值。也可以通過重寫LoadPageStateFromPersistenceMediumSavePageStateToPersistenceMedium方法來實現。

4、把ViewState移到頁面底部
通過重寫頁面的Render方法來實現。

發佈了28 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章