維護控制項的狀態
ASP.NET 伺服器控制項會從 Control 繼承名為 ViewState 的屬性,使它可以輕易地參與狀態管理。ViewState 的型別是 System.Web.UI.StateBag,它是一個儲存名稱/值配對的字典。ViewState 是由 ASP.NET 網頁架構保存為字串變數,並傳送給用戶端且返回成一個隱藏變數。當回傳時,網頁架構會剖析隱藏變數中的輸入字串,並填入 (Populate) 每一個控制項的 ViewState 屬性。當控制項使用 ViewState 而不使用私用欄位作為屬性資料時,即會自動保存在用戶端往返時的屬性 (如果屬性未保存於 ViewState,實務上應該在回傳時傳回它的預設值)。
下列的程式碼片段將說明儲存於 ViewState 的屬性。
public String Text {
get {
return (String) ViewState["Text"];
}
set {
ViewState["Text"] = value;
}
}
[Visual Basic]
Public Property Text() As String
Get
Return CType(ViewState("Text"), String)
End Get
Set
ViewState("Text") = value
End Set
End Property
如需使用 ViewState 以儲存屬性的範例,請參閱 ASP.NET 快速入門 -> ASP.NET Web Form -> 撰寫自訂的控制項。
注意 ViewState 通常是用於保存網頁往返時的表單資料。請不要使用 ViewState 來儲存密碼、連接字串和檔案路徑之類的資訊。如需在網頁間共享資料和永續性儲存體 (Persistent Storage) 的詳細資訊,請參閱 ASP.NET 狀態管理。
可以保存於 ViewState 的型別
可序列化或已定義為 TypeConverter 的型別都可以保存於 ViewState。然而,只可序列化的型別和具有 TypeConverter 的型別相比則較慢且會產生一個很大的 ViewState。ViewState 是使用有限制的物件序列化 (Serialization) 格式來序列化,這種格式已為基本型別以及 String、ArrayList 和 HashTable 型別最佳化。
ViewState 和效能
控制項開發人員應該注意 ViewState 中的任何資料會自動在用戶端往返。因為往返會導致效能損耗,所以在使用 ViewState 時必須仔細考慮。當有數個屬性和通用資料相依時,您可以只保存 ViewState 的索引鍵項目以最佳化效能。控制項從 Control 繼承名為 EnableViewState 的屬性,可以允許控制項的消費者啟用或停用它的 ViewState 保存性 (Persistence)。
使用 ViewState 自訂狀態還原
為增進效能,或儲存 ViewState 預設為無法儲存的自訂型別,控制項可以自訂 ViewState 中屬性資料的儲存方式。當控制項自訂屬性資料的儲存區時,控制項也必須提供自訂實作以從 ViewState 中儲存的資料來還原屬性值。為此基底類別 Control 提供了兩個方法,SaveViewState 和 LoadViewState。這些方法具有下列的簽名碼。
protected virtual object SaveViewState();
protected virtual void LoadViewState(object savedState);
[Visual Basic]
Overridable Protected Function SaveViewState() As Object
Overridable Protected Sub LoadViewState(ByVal savedState As Object)
如需覆寫 SaveViewState 和 LoadViewState 的範例,請參閱樣板化的資料繫結控制項範例。
請參閱
ASP.NET 狀態管理 | 工作階段狀態 | 應用程式狀態