如果您在編寫控制項,可以將控制項的狀態資訊儲存在 ViewState 字典中,該字典是一個 StateBag 對象。開發人員將通過 ControlState 屬性檢索控制項狀態。您為 ViewState 屬性指定鍵和值,Page 對象將對請求之間的狀態資訊進行序列化。要在您的控制項中執行自訂狀態處理,可重寫 LoadViewState 和 SaveViewState 方法。在頁開發人員禁用檢視狀態時,儲存在此字典中的所有狀態資訊都會丟失。為彌補這一缺陷,在 ASP.NET 2.0 版中,您可以將關鍵狀態資訊儲存在一個稱為控制項狀態的單獨對象中。在頁開發人員禁用檢視狀態時,控制項狀態對象不會受到影響。要將狀態資訊儲存在控制項狀態對象中,控制項需要重寫 LoadControlState 和 SaveControlState 方法,並且需要在每次初始化該控制項時將其註冊為在控制項狀態中儲存狀態資訊。可以通過重寫 OnInit 方法並調用 RegisterRequiresControlState 方法將控制項註冊為使用控制項狀態。
控制項狀態是一個包含 Web 伺服器控制項正常工作所需要的關鍵檢視狀態資料的對象,並且它包含在一個單獨的對象(與包含普通檢視狀態資訊的對象不同)中。在 Page 層級禁用檢視狀態時,控制項狀態資料不會受到影響,但是需要額外的實現步驟才能使用。
下面的程式碼範例示範一個從 PageStatePersister 類派生的類如何初始化 ControlState 屬性。此樣本將 ControlState 屬性指派給 Pair 對象的 Second 欄位,並使用 ObjectStateFormatter 類對該屬性進行序列化。調用 Load 方法時,使用 ObjectStateFormatter 類對檢視狀態和控制項狀態資訊進行還原序列化,並使用所得 Pair 對象的 Second 欄位初始化 ControlState 屬性。
//// Load ViewState and ControlState.//public override void Load(){ Stream stateStream = GetSecureStream(); // Read the state string, using the StateFormatter. StreamReader reader = new StreamReader(stateStream); IStateFormatter formatter = this.StateFormatter; string fileContents = reader.ReadToEnd(); // Deserilize returns the Pair object that is serialized in // the Save method. Pair statePair = (Pair)formatter.Deserialize(fileContents); ViewState = statePair.First; ControlState = statePair.Second; reader.Close(); stateStream.Close();}
http://aierong.cnblogs.com