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

ASP.NET 頁面生命週期全景掌控:父頁、用戶控件、事件冒泡與 ViewState 協同機制

     編輯:關於ASP.NET

ASP.NET WebForms 頁面生命週期事件繁多、順序嚴格。本文通過父頁、用戶控件、子控件三層代碼實例,演示 OnInit、OnLoad、ViewState、事件冒泡的協同運作。

核心事件順序速記

  1. PreInit → Init → InitComplete
  2. PreLoad → Load → LoadComplete
  3. PreRender → PreRenderComplete
  4. SaveStateComplete → Render → Unload

關鍵原則:父控件事件先於子控件;Init 階段建立控件樹、綁定事件;Load 階段處理回傳資料、ViewState 已恢復。

父頁基類:統一横切邏輯

public class UserParentPage : System.Web.UI.Page {
    protected override void OnInit(EventArgs e) {
        // 1. SQL 注入防護:檢查 QueryString/Form 可疑字符
        // 2. 全域權限檢查、文化設置、主題套用
        base.OnInit(e);
    }
    protected override void OnLoad(EventArgs e) {
        // 3. 頁面級資料載入、快取策略
        base.OnLoad(e);
    }
}

用戶控件:封裝可復用 UI 與事件

public partial class UserEventControl : System.Web.UI.UserControl {
    public delegate void ChangedHandler();
    public event ChangedHandler Changed; // 對外暴露事件

    private void Page_Load(object sender, EventArgs e) {
        if (!Page.IsPostBack) SetContent(); // 首次載入綁定資料
    }

    private void SetContent() {
        // 動態生成 Table + LinkButton,每個按鈕綁定 __doPostBack
        // 關鍵:ClientID 替換 "_" 為 "$" 以符合事件目標格式
    }

    protected override void OnInit(EventArgs e) {
        InitializeComponent(); // 綁定 Click 事件
        base.OnInit(e);
    }

    private void lbtnShow_Click(object sender, EventArgs e) {
        CurrentID = Request.Form["__EVENTARGUMENT"]; // 獲取回傳參數
        SetContent(); // 重新綁定(因樣式可能改變)
        Changed?.Invoke(); // 冒泡事件通知父頁
    }

    public string CurrentID {
        get => (string)ViewState["CurrentID"]; // ViewState 跨回傳保持狀態
        set => ViewState["CurrentID"] = value;
    }
}

父頁消費用戶控件事件

public partial class ConsumerPage : UserParentPage {
    protected void UserEventControl1_Changed(object sender, EventArgs e) {
        // 子控件觸發 Changed 事件後執行
        // 可讀取 UserEventControl1.CurrentID 執行業務邏輯
    }
}
// .aspx 中註冊
<%@ Register Src="~/Controls/UserEventControl.ascx" TagPrefix="uc" TagName="UserEventControl" %>
<uc:UserEventControl ID="UserEventControl1" runat="server" OnChanged="UserEventControl1_Changed" />

ViewState 與事件冒泡關鍵點

機制關鍵點常見錯誤
ViewState僅序列化標記 EnableViewState=true 的控件屬性;自定義屬性必須手動存取 ViewState[key]在 Init 前存取 ViewState 為 null;大量資料導致頁面膨脹
事件冒泡子控件 RaiseBubbleEvent → 父控件 OnBubbleEvent → 頁面 RaisePostBackEvent動態建立控件未在 Init 階段重建,事件不觸發
__doPostBack生成 __EVENTTARGET (控件 UniqueID) + __EVENTARGUMENT (自定義參數)ClientID 與 UniqueID 混淆,導致目標控件找不到

最佳實踐清單

  • 父頁基類集中處理安全、日誌、文化等横切關注點。
  • 用戶控件封裝完整 UI+行為,透過事件與外部解耦。
  • 動態控件必須在 OnInit 中重建,並恢復 ViewState。
  • 大數據場景關閉控件/頁面 ViewState,改用 Session/快取/隱藏欄位。
  • 使用 Page.Trace 或 Trace.axd 監控生命週期耗時與 ViewState 大小。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved