母版頁提供網站版面的統一範本機制,讓開發者定義共同版面(Header、Footer、導航列、樣式),內容頁僅專注於差異化內容,實現「寫一次版面,到處套用」的維護優勢。
.master,包含共同 HTML 結構與 <asp:ContentPlaceHolder> 佔位符.aspx,透過 MasterPageFile 指定母版頁,內容置於 <asp:Content> 標籤對應特定 ContentPlaceHolderMasterPage.master
<%@ Master Language="C#" %>
<!DOCTYPE html>
<html>
<head>
<title><asp:ContentPlaceHolder ID="head" runat="server" /></title>
<link href="~/Styles/Site.css" rel="stylesheet" />
</head>
<body>
<header>
<h1>網站標題 - 來自母版頁</h1>
<nav><asp:ContentPlaceHolder ID="Navigation" runat="server" /></nav>
</header>
<main>
<asp:ContentPlaceHolder ID="MainContent" runat="server">
<!-- 預設內容,內容頁可選擇覆蓋 -->
</asp:ContentPlaceHolder>
</main>
<footer>
© 2024 My Website. All rights reserved.
</footer>
</body>
</html>
<%@ Master %>:宣告此檔案為母版頁<asp:ContentPlaceHolder>:定義可被內容頁取代的區塊,ID 屬性為唯一識別碼Default.aspx
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" Title="首頁" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
<meta name="description" content="首頁描述" />
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>歡迎來到首頁</h2>
<p>這是首頁專屬內容。</p>
</asp:Content>
<%@ Page MasterPageFile="..." %>:指定套用的母版頁路徑<asp:Content ContentPlaceHolderID="..." >:對應母版頁特定 ContentPlaceHolder內容頁可像一般頁面一樣使用任何伺服器控制項:
<asp:Content ContentPlaceHolderID="MainContent" runat="server">
<h2>會員登入</h2>
<form runat="server">
<div>
<label>帳號:</label>
<asp:TextBox ID="txtAccount" runat="server" />
</div>
<div>
<label>密碼:</label>
<asp:TextBox ID="txtPassword" TextMode="Password" runat="server" />
</div>
<asp:Button ID="btnLogin" Text="登入" runat="server" OnClick="btnLogin_Click" />
</form>
</asp:Content>
大型網站常需「站台級母版頁」→「區域級母版頁」→「內容頁」三層架構:
Site.master(站台級)
<%@ Master Language="C#" %>
<!DOCTYPE html>
<html><body>
<header>全站共用 Header</header>
<asp:ContentPlaceHolder ID="RegionContent" runat="server" />
<footer>全站共用 Footer</footer>
</body></html>
Admin.master(管理區母版頁,繼承 Site.master)
<%@ Master Language="C#" MasterPageFile="~/Site.master" %>
<asp:Content ContentPlaceHolderID="RegionContent" runat="server">
<nav>管理區側邊選單</nav>
<asp:ContentPlaceHolder ID="AdminPageContent" runat="server" />
</asp:Content>
Admin_Users.aspx(管理區內容頁)
<%@ Page MasterPageFile="~/Admin.master" %>
<asp:Content ContentPlaceHolderID="AdminPageContent" runat="server">
<h2>使用者管理</h2>
<!-- 具體內容 -->
</asp:Content>
// 母版頁定義公用屬性
public string SiteTitle { get; set; } = "My Site";
// 內容頁存取
var master = (SiteMaster)this.Master;
master.SiteTitle = "自訂標題";
var lbl = (Label)Master.FindControl("lblHeaderText");
if (lbl != null) lbl.Text = "新標題";
母版頁可訂閱內容頁控制項事件,或透過介面定義契約雙向通訊。
~/MasterPages/ 目錄~/MasterPage.master 避免部署路徑問題| 錯誤現象 | 原因 | 解決 |
|---|---|---|
| 內容頁內容不顯示 | ContentPlaceHolderID 拼寫錯誤 | 檢查母版頁與內容頁 ID 完全一致(含大小寫) |
| 無法載入母版頁 | MasterPageFile 路徑錯誤 | 使用 ~ 根目錄運算子,確認 .master 檔案存在 |
| 巢狀母版頁樣式遺失 | CSS 路徑相對參考錯誤 | 母版頁使用 ResolveUrl("~/Styles.css") 或 <link href="~/..."> |
| 內容頁標題不生效 | 母版頁 <title> 未放置 ContentPlaceHolder | 在母版頁 <title><asp:ContentPlaceHolder ID="head" /></title> |
母版頁是 ASP.NET Web Forms 版面管理的核心機制,善用巢狀架構與動態互動,能建構出高度可維護的企業級 Web 應用程式。下一節將介紹資料庫連線與 ADO.NET 資料存取。