ASP.NET 1.x 無內建 Master Page,常用基類重寫 Render 實現模板頁功能。本文展示經典 WebPageTemplate 基類實作。
模板基類核心代碼
public class WebPageTemplate : System.Web.UI.Page
{
// 可覆寫的區塊屬性
public string PageTitle { get; set; } = "預設標題";
public string PageHeader { get; set; } = "";
public string PageScript { get; set; } = "";
public string PageLeft { get; set; } = " 選單";
public string PageFooter { get; set; } = "版權所有
";
protected override void Render(HtmlTextWriter writer)
{
// 1. 輸出外層框架
writer.Write("" + PageTitle + "");
writer.Write(PageScript + "");
writer.Write(PageHeader);
// 2. 兩欄佈局:左側選單 + 右側內容區
writer.Write("| " + PageLeft + " | ");
// 3. 關鍵:呼叫基類 Render,讓內容頁面 (.aspx) 的 HTML/控件渲染到此處
base.Render(writer);
// 4. 結束佈局
writer.Write(" |
");
writer.Write("" + PageFooter + "
");
writer.Write("");
}
}
內容頁面使用方式
// Code-behind 繼承模板基類
public partial class MyPage : WebPageTemplate
{
protected void Page_Load(object sender, EventArgs e)
{
// 可選覆寫區塊
this.PageTitle = "我的頁面標題";
this.PageLeft = "";
// PageHeader/PageFooter/PageScript 使用預設值
}
}
<!-- MyPage.aspx 只有內容區標記,無 html/head/body -->
<asp:GridView ID="GridView1" runat="server" />
<asp:Button ID="Button1" runat="server" Text="提交" />
優缺點分析
| 優點 | 缺點 |
| ASP.NET 1.x 可用、無需 IDE 支援 | 設計檢視無法正確顯示 (VS 不識別基類佈局) |
| 邏輯集中、強型別屬性覆寫 | 佈局修改需重新編譯基類 DLL |
| 效能佳 (無額外檔案解析) | 巢狀模板、多內容區支援困難 |
演進:ASP.NET 2.0 Master Page
<!-- Site.master -->
<%@ Master Language="C#" %>
<html><head><title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title></head><body>
<div id="header">頁首</div>
<div id="left"><asp:ContentPlaceHolder ID="LeftContent" runat="server" /></div>
<div id="main"><asp:ContentPlaceHolder ID="MainContent" runat="server" /></div>
<div id="footer">頁尾</div>
</body></html>
<!-- ContentPage.aspx -->
<%@ Page MasterPageFile="~/Site.master" %>
<asp:Content ContentPlaceHolderID="MainContent" runat="server">
內容區標記...
</asp:Content>
- 設計檢視完整支援、多 ContentPlaceHolder、巢狀 Master、VS 智慧提示。
- Core / MVC 使用
Layout / _Layout.cshtml 同樣概念。
理解手工模板頁原理,有助於掌握 Master Page / Layout 內部運作,並在特殊需求下 (如動態切換佈局、無 Master 環境) 靈活應用。