理解 Web Pages 應用程式啟動與每頁請求前的初始化機制,掌握 _AppStart 與 _PageStart 的執行時機、用途與最佳實務。
_AppStart.cshtml)@* _AppStart.cshtml *@
@{
// 初始化全域計數器
AppState["VisitorCount"] = 0;
// 設定預設資料庫連線
Database.DefaultConnectionString = "Data Source=|DataDirectory|AppData.sdf";
// 註冊自訂 Helper
Helpers.Register("MyHelper", new MyCustomHelper());
// 設定預設版面
Layout = "~/Shared/_Layout.cshtml";
}
_PageStart.cshtml)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;
}

_AppStart_AppStart_PageStart_PageStart(子資料夾優先)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
| 問題 | 原因 | 解決 |
|---|---|---|
| _AppStart 未執行 | 檔名錯誤、非根目錄、非首次請求 | 確認檔名、位置、重啟應用程式池 |
| _PageStart 重複執行 | 父子資料夾皆有 _PageStart | 子資料夾優先,父層不會重複執行 |
| 版面未套用 | _PageStart 中 Layout 路徑錯誤 | 使用 ~/ 絕對虛擬路徑 |
| 驗證失效 | RunPage() 前重導向未結束 | 重導向後呼叫 Response.End() |