ViewState 是 ASP.NET WebForms 自動保持控件狀態的關鍵機制。本文剖析其運作原理、隱藏欄位結構、啟用/停用策略與傳統 ASP 差異。
| 特性 | 傳統 ASP | ASP.NET (ViewState) |
|---|---|---|
| 表單回傳後輸入值 | 全部清空 | 自動保留 |
| 使用者體驗 | 錯誤需重填 | 無感知保持 |
| 實現方式 | 手寫 value="<%=Request%>" | 隱藏欄位 __VIEWSTATE |
Page.SaveViewState() 序列化所有控件 ViewState 屬性 → Base64 字串。
4. 渲染階段輸出隱藏欄位:<input type="hidden" name="__VIEWSTATE" value="dDwtNTI0ODU5MDE1Ozs+ZBCF2ryjMpeVgUrY2eTj79HNl4Q=" />
5. 瀏覽器回傳 __VIEWSTATE。
6. Page.LoadViewState() 反序列化還原控件狀態。
7. 控件呈現時自動帶入還原值。
| 層級 | 語法 | 影響範圍 | 建議 |
|---|---|---|---|
| 頁面 | <%@ Page EnableViewState="false" %> | 全頁控件 | 純顯示頁面、報表、大量資料列表 |
| 控件 | <asp:GridView EnableViewState="false" /> | 單一控件及其子孫 | 唯讀資料繫結控件、大型 TreeView |
| 屬性 | 程式碼中 Control.ViewState["Key"] = val | 自訂狀態項目 | 僅儲存必要自訂資料,避免濫用 |
開發除錯時可用 ViewState Decoder (如 Fritz Onion 的工具或線上解碼器) 貼上 __VIEWSTATE 值,查看實際儲存的控件狀態結構,偵測過大或敏感資料洩露。
ViewStateMode="Enabled" (ASP.NET 4.0+) 精細控制。<pages viewStateEncryptionMode="Always" />。enableViewStateMac="true" (預設) 防止竄改,叢集需同步 machineKey。理解 ViewState 本質,能在「便利性」與「效能/安全」間做最佳權衡。