動態頁面標題對 SEO、瀏覽器標籤識別、書簽收藏至關重要。ASP.NET Web Forms 提供兩種原生方式:**內嵌代碼表達式** 與 **Literal 控件佔位**,本文詳解實現細節、優缺點對比、最佳實踐。
<head runat="server">
<title><%= PageTitle %></title>
</head>
public partial class NewsView : System.Web.UI.Page
{
// 必須是 protected/public 字段,屬性需至少有 getter
protected string PageTitle = "默認標題 - 網站名";
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// 從數據庫/模型獲取真實標題
string title = GetNewsTitleFromDb(Request.QueryString["id"]);
PageTitle = $"{title} - 新聞頻道 - 我的網站";
}
}
}
| 優點 | 缺點 |
|---|---|
| 代碼極少、無額外控件開銷 | 標題必須在 `Page_Load` 前賦值 (或 `PreRender`),否則顯示默認值 | 直觀、符合 Web Forms 習慣 | 若 MasterPage 也設置標題,需協調優先級 |
<head runat="server">
<title>
<asp:Literal ID="litPageTitle" runat="server" />
</title>
</head>
public partial class NewsView : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string title = GetNewsTitleFromDb(Request.QueryString["id"]);
litPageTitle.Text = $"{title} - 新聞頻道 - 我的網站";
}
}
}
| 優點 | 缺點 |
|---|---|
| 可在任何事件中設置 (Load/PreRender/控件事件) | 額外控件實例、微小渲染開銷 | 完美配合 MasterPage:內容頁覆蓋母版頁標題 | 設計時需手動移動 Literal 到 <title> 間 (VS 設計器不支持) | 支持 HTML 編碼/腳本注入防護 (需手動處理) |
<head runat="server">
<title><asp:ContentPlaceHolder ID="TitleContent" runat="server">默認網站標題</asp:ContentPlaceHolder></title>
</head>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
<asp:Literal ID="litTitle" runat="server" />
</asp:Content>
protected void Page_Load(object sender, EventArgs e)
{
litTitle.Text = "動態生成的頁面標題";
}
原理:`ContentPlaceHolder` 默認內容被 `Content` 覆蓋,`Literal` 渲染為純文本,最終輸出 `
<head runat="server">
<title><asp:ContentPlaceHolder ID="TitleContent" runat="server"></asp:ContentPlaceHolder></title>
<meta name="description" content="<asp:ContentPlaceHolder ID="MetaDescription" runat="server"></asp:ContentPlaceHolder>" />
<meta name="keywords" content="<asp:ContentPlaceHolder ID="MetaKeywords" runat="server"></asp:ContentPlaceHolder>" />
</head>
| 場景 | 推薦方法 | 理由 |
|---|---|---|
| 簡單頁面、無 MasterPage | 內嵌表達式 `<%= PageTitle %>` | 零控件、代碼最少 |
| 使用 MasterPage、需 SEO Meta | Literal + ContentPlaceHolder | 標準化、靈活、支持多標籤 |
| 標題需在按鈕點擊後動態變更 | Literal | 可在任何回發事件中設置 |
掌握兩種方法,根據項目架構選擇。現代 ASP.NET Core MVC/Razor Pages 推薦使用 `@ViewData["Title"]` 或 `@Model.Title`,原理相通。