如果您在編寫控件,可以將控件的狀態信息存儲在 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