瀏覽器收到的 HTML 中,那些神秘的隱藏欄位 (__VIEWSTATE, __EVENTVALIDATION)、自動插入的 JavaScript (WebForm_InitCallback, __doPostBack) 是什麼?為什麼沒有它們頁面就會壞?本文逐一拆解客戶端產物的用途、生成時機與安全機制,並揭示聲明式標記如何轉化為客戶端邏輯。
| 產物 | 用途 | 生成條件 |
|---|---|---|
__VIEWSTATE | 儲存控件屬性狀態 (啟用 ViewState 者) | 頁面/控件 EnableViewState=true |
__VIEWSTATEGENERATOR | ViewState 簽名雜湊,防篡改 (ASP.NET 4.0+) | 同上 |
__EVENTVALIDATION | 記錄合法回發控件/引數,防偽造回發 (ASP.NET 2.0+) | EnableEventValidation=true (預設) |
__EVENTTARGET | 記錄觸發回發的控件 UniqueID | 有 __doPostBack 呼叫時 |
__EVENTARGUMENT | 記錄回發附帶參數 | 同上 |
__LASTFOCUS | 記錄最後焦點控件 (配合 Focus()) | 有控件呼叫 Focus() |
WebForm_InitCallback | 初始化回呼機制 (Callback/UpdatePanel) | 頁面含 ICallbackEventHandler 或 ScriptManager |
__doPostBack(eventTarget, eventArgument) | 統一回發入口,設定隱藏欄位並 submit form | 控件需回發 (Button, LinkButton, AutoPostBack=true) |
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
value="/wEPDwULLTE3MDU5MjY4MTkPZBYCAgMPZBYCAgEPFCsAAmRkFgZmD2QWAmYPDxYCHgRUZXh0BQ5QYXltZW50IE1ldGhvZGRkAgEPZBYCZg8PDxYCHgtfIURhdGFCb3VuZGdkZGQCBw9kFgRmDw8PFgIfAWdkZGQCAg8PDxYCHwFnZGRkZJDAqbyjCj4rjagRWSiVYTp7nQfM" />
ObjectStateFormatter (預設) 或自訂 PageStatePersister。ViewStateEncryptionMode、ViewStateCompression (自訂)。MachineKey HMACSHA256 (ASP.NET 4.5+ 預設),防竄改。頁面渲染階段,所有註冊回發的控件 (Page.ClientScript.RegisterForEventValidation) 其 UniqueID 及合法引數會被記錄進 __EVENTVALIDATION。回發時驗證:
HttpException: Invalid postback or callback argument。注意:動態產生的控件 (如 GridView 分頁、動態下拉選項) 必須在 Render 階段前註冊驗證,否則回發會被攔截。
ASP.NET AJAX (舊稱 Atlas) 嘗試用 XML-Script (XML 呈現語言) 描述客戶端元件、繫結、行為,編譯為 JavaScript。雖未成主流,但啟發了現代前端框架 (Angular, Vue, React) 的聲明式範本、資料繫結、元件化思想。
<pages enableViewState="false" />,控件級 EnableViewState="false"。<pages viewStateEncryptionMode="Auto" />,配置 machineKey。enableEventValidation。PageStatePersister 儲存 ViewState 至 Session/快取,客戶端僅保留 Token。ASP.NET 客戶端產物是無狀態 HTTP 上模擬有狀態 UI 的精妙工程。理解每個隱藏欄位與自動腳本的來龍去脈,能讓你在安全稽核、效能優化、前端整合、遷移現代框架時,做出精準決策。別讓「自動生成」成為「不可知」的藉口。