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

ASP.NET 基類 Page_Load 執行順序陷阱與解決方案

     編輯:關於ASP.NET

現象:基類 PageBase 在 Page_Load 驗證權限,但子類頁面的 Page_Load 卻**先於**基類執行,導致未驗證即執行業務邏輯,存在安全隱患。

根本原因

  • Page_Load 是透過 OnInit 註冊到 Load 事件的:this.Load += Page_Load;
  • 子類 OnInit 先註冊自己的 Page_Load,再呼叫 base.OnInit(),導致子類處理器在委派鏈**前面**,優先執行。

解決方案一:基類改寫 OnLoad(推薦)

public class PageBase : Page
{
    protected override void OnLoad(EventArgs e)
    {
        // 1. 先驗證
        if (!ValidateUser()) 
        {
            Response.Redirect("Login.aspx");
            return;
        }
        // 2. 再觸發 Load 事件(含子類 Page_Load)
        base.OnLoad(e);
    }
}

原理:Load 事件是在 OnLoad 中引發(base.OnLoad 內部呼叫 OnLoad(EventArgs.Empty)),在 base.OnLoad 前攔截即可保證先執行驗證。

解決方案二:子類 OnInit 先呼叫 base.OnInit

public class ChildPage : PageBase
{
    override protected void OnInit(EventArgs e)
    {
        base.OnInit(e); // 先讓基類註冊 Page_Load
        // 再做子類初始化
        InitializeComponent();
    }
}

缺點:需強制所有子類遵守此規範,易遺漏。

最佳實踐建議

  1. 統一採用方案一,在基類 OnLoad 集中處理驗證、日誌、通用資料載入。
  2. 子類僅實作具體業務 Page_Load,不覆寫 OnInit/OnLoad。
  3. 若需在 Load 事件前執行邏輯,改寫 OnPreInit、OnInit、OnInitComplete 等更早期事件。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved