頁面生命週期 11 大階段
ASP.NET Web Forms 頁面從請求到回應,會依序觸發下列事件,理解順序對撰寫正確邏輯至關重要:
- PreInit:最早階段,適合動態建立控制項、設定 Master Page、Theme、讀取 Profile。注意:回發時 ViewState 尚未還原,控制項屬性值可能被覆寫。
- Init:所有控制項初始化完成、外觀套用後觸發,適合讀取/初始化控制項屬性。
- InitComplete:頁面初始化完全結束,可處理需等待所有初始化完成的工作。
- PreLoad:Load 之前,頁面已載入 ViewState 並處理回發資料。
- Load:頁面與所有子控制項遞迴觸發 Load,常用於設定屬性、建立資料庫連線。
- 控制項事件:如 Button Click、TextChanged 等。回發時需先檢查
Page.IsValid。
- LoadComplete:所有控制項載入完成,可執行需等待其他控制項準備好的工作。
- PreRender:輸出前最後修改頁面內容的機會,資料繫結控制項會自動呼叫 DataBind。
- SaveStateComplete:ViewState 已儲存,此後修改控制項將被忽略。
- Render:非事件,頁面對每個控制項呼叫 Render 輸出 HTML 標記。
- Unload:清理資源(關閉連線、檔案、記錄日誌),不可再修改回應串流。
回發時的執行順序實測
點擊按鈕觸發回發時,事件順序為:
OnPreInit → OnInit → OnInitComplete → OnPreLoad → Page_Load → OnLoad
→ Button_Click → OnLoadComplete → OnPreRender
可見 Button_Click 發生在 OnLoad 之後,這對於理解資料繫結與事件處理時機非常關鍵。
ASP.NET 請求管道 19 個階段
從 IIS 接收請求到回應結束,完整管道事件如下:
- BeginRequest - 開始處理請求
- AuthenticateRequest - 身分驗證
- PostAuthenticateRequest
- AuthorizeRequest - 授權檢查
- PostAuthorizeRequest
- ResolveRequestCache - 取得頁面快取
- PostResolveRequestCache
- PostMapRequestHandler - 建立頁面物件
- AcquireRequestState - 取得 Session(需實作 IRequiresSessionState)
- PostAcquireRequestState
- PreRequestHandlerExecute - 準備執行頁面
- 執行 ProcessRequest
- PostRequestHandlerExecute - 頁面執行完成
- ReleaseRequestState - 釋放請求狀態
- PostReleaseRequestState
- UpdateRequestCache - 更新快取
- PostUpdateRequestCache
- LogRequest - 記錄日誌
- PostLogRequest
- EndRequest - 請求結束
實作建議
- 在
Global.asax 或自訂 IHttpModule 中掛鉤管道事件,實作跨領域關注點(日誌、效能監控、安全檢查)
- 需要存取 Session 的模組必須實作
IRequiresSessionState 或 IReadOnlySessionState
- 頁面生命週期事件請優先使用
OnXxx 覆寫而非 Page.Xxx += ...,確保執行順序可控