ASP.NET Web Forms 頁面生命週期是服務端開發的「心跳」。理解每個階段的**執行順序、數據狀態、可用操作**,是解決 ViewState 丟失、動態控件消失、回發事件不觸發等經典疑難雜症的前提。本文整理 22 個精確階段、核心事件表、數據流向圖與最佳實踐。
| 階段 | 核心任務 | 關鍵屬性/動作 |
|---|---|---|
| 頁面請求 | 決定是否編譯/返回緩存 | 無 |
| 開始 | 初始化 Request/Response、IsPostBack、UICulture | Page.Request, Page.IsPostBack |
| 初始化 | 構建控件樹、應用主題、生成 UniqueID | Control.Init 事件 |
| 加載 | 回發時恢復 ViewState/ControlState | Page.Load 事件 |
| 驗證 | 執行驗證控件 Validate() | Page.IsValid |
| 回發事件處理 | 觸發按鈕點擊、文本變更等事件 | Button.Click, TextBox.TextChanged |
| 呈現 | 保存 ViewState、輸出 HTML | Control.Render |
| 卸載 | 清理資源、關閉連接 | Page.Unload |
_CallBackId,設置 IsCallback。Page.PreInit 事件 (最早可訪問 IsPostBack)。Init 事件、啟動 TrackViewState。Page.InitComplete 事件。RegisterRequiresControlState 的控件狀態。IPostBackDataHandler 的控件 (如 TextBox) 從回發數據更新屬性。Page.PreLoad 事件。Load 事件。**動態添加控件的最後機會** (需手動補 Init/Load)。TextChanged)。Click, Command)。Page.LoadComplete 事件。EnsureChildControls、數據綁定控件 DataBind()、觸發 PreRender 事件。**最後修改頁面內容的機會**。Page.PreRenderComplete 事件。Page.SaveStateComplete 事件。RenderControl(HtmlTextWriter) 輸出 HTML。Render;用戶控件 (.ascx) 自動合併。Unload 事件,釋放非托管資源、關閉連接、寫日誌。
| 事件 | 觸發時機 | 典型用途 | 注意事項 |
|---|---|---|---|
PreInit | 最早 | 動態控件、MasterPage、Theme、Profile | 控件樹未建,勿訪問子控件 |
Init | 控件樹建完 | 讀取/初始化控件屬性 | ViewState 尚未恢復 |
InitComplete | 初始化結束 | 需先完成初始化的任務 | - |
PreLoad | Load 前 | ViewState 恢復後、Load 前處理 | - |
Load | 核心業務 | 數據庫查詢、綁定數據源、設置屬性 | **最常用**,IsPostBack 區分首載/回發 |
| 控件事件 | 回發中 | Click、TextChanged、SelectedIndexChanged | 需 AutoPostBack=true |
LoadComplete | 加載結束 | 所有控件就緒後的收尾 | - |
PreRender | 呈現前 | **最後修改頁面/控件屬性**、動態調整 | 之後修改不進 ViewState |
SaveStateComplete | ViewState 保存後 | 需狀態已保存、無需修改控件的任務 | - |
Render | 輸出 HTML | 自定義控件輸出標記 | 非事件,勿做邏輯 |
Unload | 最後 | 清理資源、關閉連接、寫日誌 | Response 已發送,不可輸出 |
AutoEventWireup@Page AutoEventWireup="true" (默認):自動綁定 Page_Load, Page_Init 等命名約定方法。false:需手動 this.Load += Page_Load;,性能微優、避免重複綁定。PreRender 前:DataSourceID 控件自動 DataBind()。DataBind():建議在 Load 或 PreRender 執行。SaveViewState 後修改綁定數據:**不會持久化**,下次回發丟失。每次請求 (含回發) 都必須在
PreInit或Init中重建動態控件,並保證 ID 一致,以便 ViewState/PostData 正確匹配。
生命週期不是背誦題,而是**調試地圖**。遇到「控件值丟失」「事件不觸發」「驗證不生效」,對著 22 步定位階段,錯在哪步,修哪步。