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

ASP.NET Web Pages 全域頁面:_AppStart 與 _PageStart 生命週期完整解析

     編輯:ASP.NET 基礎

ASP.NET Web Pages 全域頁面機制:_AppStart 與 _PageStart


理解 Web Pages 應用程式啟動與每頁請求前的初始化機制,掌握 _AppStart 與 _PageStart 的執行時機、用途與最佳實務。


_AppStart - 應用程式啟動初始化

運作機制

  • 放置於網站根目錄
  • 副檔名與網頁一致(如 _AppStart.cshtml)
  • 下劃線前綴:無法直接瀏覽存取
  • 網站接收第一個請求時自動執行
  • 整個應用程式生命週期僅執行一次

典型應用場景

  • 全域變數初始化(計數器、快取物件、設定值)
  • 資料庫連線字串建構與驗證
  • 第三方服務初始化(Log、Email、快取)
  • 路由表註冊、自訂 Helper 註冊
  • 應用程式層級安全性設定

程式碼範例

@* _AppStart.cshtml *@
@{
    // 初始化全域計數器
    AppState["VisitorCount"] = 0;
    
    // 設定預設資料庫連線
    Database.DefaultConnectionString = "Data Source=|DataDirectory|AppData.sdf";
    
    // 註冊自訂 Helper
    Helpers.Register("MyHelper", new MyCustomHelper());
    
    // 設定預設版面
    Layout = "~/Shared/_Layout.cshtml";
}

_PageStart - 每頁請求前初始化

運作機制

  • 可放置於任意資料夾,影響該資料夾及子資料夾所有頁面
  • 副檔名與網頁一致(如 _PageStart.cshtml)
  • 下劃線前綴:無法直接瀏覽存取
  • 每個頁面請求執行前自動執行
  • 執行順序:_AppStart → _PageStart → 目標頁面

典型應用場景

  • 設定資料夾層級共用版面(Layout)
  • 驗證使用者登入狀態、權限檢查
  • 設定頁面共用資料(選單、使用者資訊)
  • 區域性安全性檢查(管理區、會員區)
  • 記錄頁面存取日誌、分析追蹤

程式碼範例

@* 管理區 _PageStart.cshtml *@
@{
    // 設定管理區共用版面
    Layout = "~/Admin/Shared/_AdminLayout.cshtml";
    
    // 驗證管理員權限
    if (!WebSecurity.IsAuthenticated || !Roles.IsUserInRole("Admin")) {
        Response.Redirect("~/Account/Login?returnUrl=" + Request.Url.PathAndQuery);
    }
    
    // 設定共用頁面資料
    Page.AdminMenu = GetAdminMenu();
    Page.CurrentUser = WebSecurity.CurrentUserName;
}

執行流程圖解

執行流程圖

詳細執行順序

  1. 接收 HTTP 請求
  2. 檢查根目錄是否存在 _AppStart
  3. 若存在且為首次請求 → 執行 _AppStart
  4. 檢查目標頁面所在資料夾(含父層)是否存在 _PageStart
  5. 若存在 → 執行最近的 _PageStart(子資料夾優先)
  6. 執行目標頁面
  7. 可在 _PageStart 中呼叫 RunPage() 指定目標頁面執行位置

進階控制:RunPage() 方法

@* _PageStart.cshtml *@
@{
    // 前置處理:驗證、記錄、設定共用資料
    LogPageAccess(Request.Path);
    
    if (!IsPost) {
        InitializePageData();
    }
    
    // 執行目標頁面(預設行為)
    RunPage();
    
    // 後置處理:清理、記錄回應時間
    LogResponseTime();
}

目錄結構範例

網站根目錄/
├── _AppStart.cshtml           # 應用程式啟動
├── Default.cshtml
├── _PageStart.cshtml          # 全站每頁前置
├── Shared/
│   └── _Layout.cshtml
├── Admin/
│   ├── _PageStart.cshtml      # 管理區每頁前置(權限檢查)
│   ├── Dashboard.cshtml
│   └── Users.cshtml
├── Member/
│   ├── _PageStart.cshtml      # 會員區每頁前置(登入檢查)
│   ├── Profile.cshtml
│   └── Orders.cshtml
└── Api/
    ├── _PageStart.cshtml      # API 區每頁前置(Token 驗證)
    └── Products.cshtml

最佳實務建議

  1. 職責分離:_AppStart 處理應用層初始化,_PageStart 處理請求層前置邏輯
  2. 效能考量:_PageStart 避免重耗運算,共用資料用快取
  3. 安全優先:敏感區域務必在 _PageStart 驗證權限
  4. 避免副作用:_PageStart 不應直接輸出內容,除非呼叫 RunPage() 前
  5. 測試驗證:單元測試覆蓋 _PageStart 驗證邏輯

常見問題

問題原因解決
_AppStart 未執行檔名錯誤、非根目錄、非首次請求確認檔名、位置、重啟應用程式池
_PageStart 重複執行父子資料夾皆有 _PageStart子資料夾優先,父層不會重複執行
版面未套用_PageStart 中 Layout 路徑錯誤使用 ~/ 絕對虛擬路徑
驗證失效RunPage() 前重導向未結束重導向後呼叫 Response.End()
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved