ASP.NET WebForm 頁面指令 `<%@ Page ... %>` 中三個屬性最易混淆:Inherits、CodeFile、CodeBehind。本文釐清其用途、適用專案類型與編譯模式差異。
快速比較表
| 屬性 | 用途 | 適用專案類型 | 執行階段作用 | Visual Studio 行為 |
Inherits |
指定頁面繼承的代碼隱藏類別完整名稱(含命名空間) |
所有類型 |
執行時必要,ASP.NET 執行引擎依此載入類別 |
自動同步類別名稱 |
CodeFile |
指定代碼隱藏原始碼檔案相對路徑(.cs/.vb) |
網站專案 (Web Site Project) |
執行時動態編譯原始碼 |
管理 .cs 與 .aspx 對應關係 |
CodeBehind |
指定代碼隱藏編譯後組件中的檔案名稱 |
Web 應用程式專案 (Web Application Project) |
執行時忽略,僅供 VS 設計階段使用 |
追蹤 .aspx 與 .cs 關聯,支援設計器雙向同步 |
典型頁面指令範例
網站專案 — 動態編譯
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs"
Inherits="_Default" %>
Default.aspx.cs 需放在同目錄或 App_Code。
- 類別宣告:
public partial class _Default : System.Web.UI.Page。
- 部署時需將 .cs 檔一併複製到伺服器,ASP.NET 執行時現場編譯。
Web 應用程式專案 — 預先編譯
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="Default.aspx.cs"
Inherits="MyWebApp.Default" %>
- 專案建置時將所有 .cs 編譯為單一組件
MyWebApp.dll 放入 Bin。
- 部署時 不需部署 .cs 原始碼,只需 .aspx、.ascx、.master 等標記檔與 Bin 組件。
CodeBehind 僅供 VS 知道「哪個 .cs 對應此 .aspx」,執行引擎完全不讀取它。
常見問題與排查
| 現象 | 原因 | 解決 |
| 「找不到類別 'MyApp.Default'」 |
Inherits 命名空間/類別名稱錯誤,或組件未部署到 Bin |
檢查類別完整名稱、專案建置輸出、Bin 目錄 DLL |
| 網站專案修改 .cs 不生效 |
動態編譯快取、AppDomain 未重啟 |
觸碰 web.config、重啟網站、清除 Temporary ASP.NET Files |
| WAP 專案修改 .aspx 邏輯不生效 |
.aspx 標記變更需重新建置(預設不編譯標記) |
專案屬性 → 「建置」→ 勾選「建置時編譯視圖」或手動建置 |
| 混用 CodeFile/CodeBehind |
專案類型不符 |
網站專案用 CodeFile,WAP 用 CodeBehind,不可混用 |
判斷專案類型的方法
- 方案總管頂層顯示 「網站」** → 網站專案 (CodeFile)。
- 方案總管頂層顯示 「方案 'xxx' (1 個專案)」** → WAP (CodeBehind)。
- 專案資料夾下有
.csproj / .vbproj → WAP。
- 無專案檔、直接開啟資料夾 → 網站專案。
最佳實踐建議
- 新專案優先選 Web 應用程式專案 (WAP):預先編譯、效能較好、支援單元測試、CI/CD 友善。
Inherits 永遠寫 完整命名空間.類別名,避免同名類別衝突。
- 使用
partial class 讓設計器產生的控制項宣告與自訂邏輯分離。
- 避免在 .aspx 內寫大量 `