<!-- #include file="header.htm" --> <!-- 相對路徑,不得跨目錄 -->
<!-- #include virtual="/Shared/header.htm" --> <!-- 虛擬路徑,站內任意位置 -->
| 特性 | #include | User Control (.ascx) |
|---|---|---|
| 程式模型 | 文字插入、無封裝 | 物件導向、獨立生命週期、事件模型 |
| 重用機制 | 靜態內容為主 | 邏輯+UI 封裝、屬性/方法/事件對外 |
| 效能 | 極輕量 (無物件建立) | 建立控制項實例、經生命週期 |
| 資料傳遞 | 「穿透式」共享頁面變數 | 公開屬性、由頁面主動設定 |
| 設計工具支援 | 無 (純文字) | Visual Studio 設計檢視、智慧標籤 |
MSDN 明確建議:「慣用做法是使用 Web 使用者控制項」。
因為 `#include` 在 **動態碼執行前** 插入,被包含檔案可直接使用 **包含頁面的變數/屬性/方法**,甚至包含 `<%= %>`、`<% %>` 伺服器端標記:
<!-- _NavBar.inc -->
<ul class="nav">
<li class="<%= CurrentPage == "Home" ? "active" : "" %>"><a href="/>首頁</a></li>
<li class="<%= CurrentPage == "Product" ? "active" : "" %>"><a href="/Product">產品</a></li>
<li class="<%= CurrentPage == "About" ? "active" : "" %>"><a href="/About">關於我們</a></li>
</ul>
<!-- Default.aspx -->
<%@ Page Language="C#" %>
<script runat="server">
protected string CurrentPage = "Home"; // 頁面屬性
</script>
<!-- #include virtual="/Shared/_NavBar.inc" -->
✅ `_NavBar.inc` 直接存取 `CurrentPage`,**無需在 User Control 定義屬性、頁面賦值**。這就是「穿透式封裝」。
⚠️ **限制**:被包含檔若為 .aspx/.ascx,**其動態碼會先於主頁執行**,生命週期順序難控制,**不建議** `#include` 動態頁面。僅用於**靜態檔 (含伺服器端標記)**。
<!-- Shared/_Footer.inc -->
<footer>© 2024 MyCompany. <%= DateTime.Now.Year %></footer>
<!-- 頁面底部 -->
<%@ OutputCache Duration="86400" VaryByParam="none" Shared="true" %>
<!-- #include virtual="/Shared/_Footer.inc" -->
頁面級 `OutputCache` + `#include` 靜態片段,**整頁快取** 效果等同片段快取,但更簡單。注意:`Shared="true"` 讓多頁共用同一快取項目。
`#include` 不是過時遺物,而是**靜態片段重用、前後端分離部署、穿透式變數共享**的利器。現代 ASP.NET Web Forms 專案建議: