ViewState 預設儲存於頁面隱藏欄位 __VIEWSTATE,內容為 Base64 編碼字串。ASP.NET 2.0 重構持久化架構,引入 PageStatePersister 抽象類別,提供兩種內建實作:
僅需覆寫頁面的 PageStatePersister 屬性:
protected override PageStatePersister PageStatePersister
{
get { return new SessionPageStatePersister(this); }
}
對比 ASP.NET 1.1 需同時覆寫 SavePageStateToPersistenceMedium 與 LoadPageStateFromPersistenceMedium 兩個方法,2.0 架構更簡潔。
若需支援特殊客戶端(如不支援隱藏欄位、Cookie 的舊裝置),可繼承 PageStatePersister 並實作:
Save():將 ViewState 與 ControlState 序列化至持久媒介(資料庫、檔案、Cache 等)。Load():從媒介還原狀態物件。StateFormatter 屬性(IStateFormatter)處理物件序列化/反序列化為 Base64 字串。配合 頁面配接器,可根據瀏覽器類型動態選擇持久化策略(如桌面瀏覽器用 HiddenField,行動裝置用 Session)。
Page
└─ PageStatePersister (abstract)
├─ HiddenFieldPageStatePersister (default)
├─ SessionPageStatePersister
└─ CustomPageStatePersister (your implementation)
└─ IStateFormatter (via StateFormatter property)
└─ ObjectStateFormatter (default, efficient Base64 serialization)
| 策略 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| HiddenField (預設) | 無伺服器狀態、支援 Web Farm | 增加頁面大小、頻寬消耗 | 一般網頁、ViewState 適中 |
| Session | 頁面精簡、頻寬節省 | 佔用伺服器記憶體、Web Farm 需共享 Session | 行動裝置、大量 ViewState 頁面 |
| 自訂 (DB/Cache) | 彈性最高、可跨伺服器共享 | 開發複雜、延遲較高 | 特殊需求、超大型 ViewState |
理解 ViewState 持久化機制,能針對專案特性選擇最佳策略,平衡頻寬、記憶體與開發成本。