首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

ViewState 機制深度解析(一):基本原理、頁面生命週期與序列化流程

     編輯:關於.NET

前言

ViewState 是 ASP.NET 解決 HTTP 無狀態特性的核心機制,透過在頁面回傳間持久化控件狀態,賦予 Web Form「記憶」能力。本系列第一部分建立整體認知:基本工作模式、客戶端形態、伺服器端三大核心類別協作、頁面生命週期關鍵節點、序列化/反序列化完整流程。

一、 ViewState 是什麼?

針對同一個 Page 的多次請求,Page 實例每次請求結束即銷毀。ViewState 將必要狀態序列化為字串,夾帶在回傳表單中發送給客戶端;下次請求時客戶端攜帶返回,伺服器反序列化還原控件狀態。本質上是「客戶端儲存、伺服器還原」的狀態持久化模式。

二、 客戶端形態

HTML 中呈現為隱藏欄位:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" 
       value="/wEPDwULLTE0MTAzNDUwNThkZKr77J2uy7fatyBou8PocG80X4Jt" />

Value 為 Pair 物件序列化 → Base64 編碼後的字串。可用 ViewStateDecoder 等工具解碼檢視。

三、 伺服器端三大核心類別協作

  • Page:處理請求生命週期,負責序列化/反序列化協調。
  • Control:基底類別,實作 ViewState 屬性、遞迴載入/儲存/追蹤邏輯。
  • StateBag:具狀態追蹤的字典,實際儲存 Key/Value,管理 IsDirty 標記。

協作流程:

  1. Page 反序列化 __VIEWSTATE 為 Pair。
  2. Page 呼叫 Control.LoadViewStateRecursive 遞迴分發狀態至各控件的 ViewState。
  3. 事件處理過程中控件屬性變更,觸發 ViewState.Add 設定 IsDirty=true。
  4. 請求結束前 Page 呼叫 Control.SaveViewStateRecursive 遞迴收集 IsDirty 項目。
  5. Page 序列化為字串,寫入 __VIEWSTATE 回傳客戶端。

四、 頁面生命週期關鍵節點

階段方法ViewState 相關動作
初始化Control.InitRecursive遞迴呼叫 TrackViewState() → StateBag.marked=true 開啟追蹤
載入Page.LoadAllState (僅 PostBack)LoadPageStateFromPersistenceMedium 反序列化 → LoadViewStateRecursive 分發
儲存Page.SaveAllStateSaveViewStateRecursive 收集 → SavePageStateToPersistenceMedium 序列化
渲染HtmlForm.RenderChildren → Page.RenderViewStateFields將序列化字串寫入 __VIEWSTATE 隱藏欄位

五、 序列化與反序列化核心:ObjectStateFormatter

HiddenFieldPageStatePersister 使用 ObjectStateFormatter:

序列化

  1. MemoryStream 序列化物件圖。
  2. 取得位元組陣列 buf。
  3. 若需加密:MachineKeySection.EncryptOrDecryptData(true, buf...)。
  4. 否則若需 MAC:MachineKeySection.GetEncodedData(buf...) 附加 SHA1/MD5 雜湊。
  5. Convert.ToBase64String 輸出字串。

反序列化

  1. Convert.FromBase64String 解碼位元組陣列。
  2. 若加密:EncryptOrDecryptData(false, buf...) 解密。
  3. 否則若 MAC:GetDecodedData 驗證雜湊,失敗拋例外。
  4. MemoryStream 反序列化回 Pair 物件。

結語

ViewState 以 Pair 樹狀結構映射控件樹,透過 StateBag.IsDirty 精準追蹤變更,配合 ObjectStateFormatter 的加密/簽名機制,在客戶端與伺服器間安全、高效地傳遞狀態。掌握生命週期節點與序列化管線,是進階 ASP.NET 開發與疑難排解的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved