代碼討論
IndexButton 控制項的實現闡釋了三個任務,必須執行這三個任務才能使控制項參與控制項狀態:
· 重寫 OnInit 方法並調用 RegisterRequiresControlState 方法向頁面註冊,以參與控制項狀態。必須針對每個請求完成此任務。
· 重寫 SaveControlState 方法,以在控制項狀態中儲存資料。
· 重寫 LoadControlState 方法,以從控制項狀態載入資料。此方法調用基類方法,並擷取基類對控制項狀態的基值。如果 indexValue 欄位不為零,而且基類的控制項狀態也不為空白,Pair 類便可作為方便的資料結構使用,用來儲存和還原由兩部分組成的控制項狀態。
分析總結
從MSDN上的一系列的技術參考來看,ControlState應該是主要在自訂控制項上使用,“ASP.NET 頁架構提供了 ControlState 屬性作為在伺服器往返過程中儲存自訂控制項資料的方法”,這是MSDN上的原句,ASP.NET2.0隻是為ControlState提供了一個基礎,當 ControlState是一個自訂的狀態保持機制,也就是說保持狀態的機制需要你開發人員自己去完成,而不像ViewState,它有自己預設的狀態保持機制。在自訂控制項使用ControlState也許才是微軟本意了,為的就避免在頁面層級禁用掉ViewState後,自訂控制項還能正常運行。當然這裡的意思就是,某些控制項的正確運行是依賴於它的狀態資訊的,在ASP.NET1.1中,如果禁用了ViewState,這樣的控制項就無法正確運行了。但引入了ControlState後就不同了,因為ControlState是禁用不掉的。
所以微軟才提醒開發人員“請僅對那些在回傳過程中對控制項至關重要的少量關鍵資料使用控制項狀態,而不要將控制項狀態作為檢視狀態的備用選項使用”。明確說出,ControlState和 ViewState完全是兩個東西,雖然它們可以完成相同的任務,新推出的ControlState既不是用來替代ViewState也不是用來做 ViewState的替補。它的使命是彌補ViewState的所不能完成的任務,讓開發人員開發出更加健壯的控制項。例如說,開發的自訂控制項某個狀態是至關重要的,缺少它就自訂控制項不能正常工作,那麼ControlState就該上場了。而且ControlState是自訂的狀態保持機制,也限制了 ControlState自由的使用,你不但要在OnInit 方法並調用 RegisterRequiresControlState 方法向頁面註冊,而且要重寫SaveAdapterControlState(),LoadAdapterControlState(object state)兩個方法自己去實現要儲存什麼,怎樣儲存。根據我現在的理解,如果你需要儲存該控制項的10種不同狀態,那你就得一一儲存,再一一載入上去。從這點也就看出了微軟的初衷了,那不是很明顯嗎,如果不需要ControlState那就不使用它吧,否則怎麼它什麼都讓我們開發人員去做呢?
這隻是基礎了,剛才我說了,似乎微軟也是這麼說的,ControlState針對的是自訂控制項,其實我們真的要去開啟基本控制項例如Label 控制項的ControlState,微軟也是允許的,這就是稍深的內容了,這就涉及到控制項適配器了(ControlAdapter)。如果需要瞭解這方面的內容,請看用控制項適配器開啟基本控制項的ControlState。http://sifang2004.cnblogs.com/archive/2006/06/01/415288.html
附錄
為了更加充分理解上面的內容,需要對以下內容有個瞭解:
Pair 類
用作儲存兩個相關對象的基本結構。它是在整個 ASP.NET 中(在如頁面狀態管理工作期間或配置節處理常式的過程中)有多種用法的工具 + 生產力類。可以在自己的代碼中需要包含兩個相關對象的結構的任意位置和不一定需要資料繫結的位置使用 Pair 類。Pair 類不將其對象引用 First 和 Second 封裝在屬性中;該類直接將它們作為公用類欄位公開到所有調用代碼。
Pair 類在頁狀態保留實現中有多種用法。最常見的用法是同時作為 ViewState 和 ControlState 集合的容器。在這種情況下,First 屬性用於 ViewState,而 Second 用於 ControlState。
PageStatePersister 類
HTTP 要求和響應原本是無狀態的。要在 HTTP 要求之間保持狀態資訊,ASP.NET 伺服器頁可以儲存 Page 狀態。此狀態稱為檢視狀態,它包含頁和控制項設定及資料,這些設定和資料使得頁和控制項看起來就像在上一次將它們提交到伺服器然後又返回到用戶端時,使用者所看到並與之互動的頁和控制項一樣。有幾種機制可在對相同頁的連續請求之間儲存檢視狀態。PageStatePersister 抽象類別表示這些狀態資訊儲存機制的基類。
要在不能支援現有檢視狀態持久性機制的用戶端上保留檢視狀態,可以擴充 PageStatePersister 類,引入您自己的檢視狀態持久性方法,並且可以使用頁適配器將 ASP.NET 應用程式配置為根據為其提供頁的用戶端的類型使用不同的檢視狀態持久性機制。從 PageStatePersister 類派生的類必須重寫 Save 抽象方法,以便在持久性介質中儲存檢視狀態和控制項狀態,同時重寫 Load 方法以提取狀態資訊。如果想知道如何寫PageStatePersister的衍生類別,請參考檢視狀態持久性機制。