指定主版頁面的標題、中繼標籤與其他 HTML 標頭 (C#)

作者 :Scott Mitchell

下載 PDF

查看從內容頁面定義主版頁面中各種 <前端> 元素的不同技術。

簡介

根據預設,在 Visual Studio 2008 中建立的新主版頁面有兩個 ContentPlaceHolder 控件:一個名為 head,並位於 元素中 <head> ,另一個名為 ,另一個名為 ContentPlaceHolder1,放在 Web Form 中。 的目的是 ContentPlaceHolder1 在 Web Form 中定義可逐頁自定義的區域。 head ContentPlaceHolder 可讓頁面將自定義內容新增至 <head> 區段。 (當然,這兩個 ContentPlaceHolders 可以修改或移除,而其他 ContentPlaceHolder 也可以新增至主版頁面。我們的主版頁面 Site.master目前有四個 ContentPlaceHolder controls.)

HTML <head> 元素可作為存放庫,以取得不屬於檔本身之網頁檔的相關信息。 這包括網頁標題、搜尋引擎或內部編目程式所使用的元數據,以及外部資源的連結,例如 RSS 摘要、JavaScript 和 CSS 檔案等資訊。 有些資訊可能與網站中的所有頁面有關。 例如,您可能想要針對每個 ASP.NET 頁面全域匯入相同的 CSS 規則和 JavaScript 檔案。 不過,有 <head> 部分元素是頁面特定的。 頁面標題是一個基本範例。

在本教學課程中,我們將探討如何在主版頁面及其內容頁面中定義全域和頁面特定的 <head> 區段標記。

檢查主版頁面的<head>區段

Visual Studio 2008 所建立的預設主版頁面檔案在其 <head> 區段中包含下列標記:

<head runat="server">
 <title>Untitled Page</title>
 <asp:ContentPlaceHolder id="head" runat="server">
 </asp:ContentPlaceHolder>
</head>

請注意,元素 <head> 包含 runat="server" 屬性,表示它是伺服器控件 (而非靜態 HTML) 。 所有 ASP.NET 頁面都衍生自 Page位於 命名空間中的 System.Web.UI 類別。 這個類別包含屬性 Header ,提供頁面 <head> 區域的存取權。 Header使用 屬性,我們可以設定 ASP.NET 頁面的標題,或將其他標記新增至轉譯的<head>區段。 然後,在頁面的事件處理程式中撰寫一些程式代碼,即可自定義內容頁面 <head>Page_Load 元素。 我們會檢查如何在步驟 1 中以程式設計方式設定頁面的標題。

上述元素中顯示的 <head> 標記也包含名為 head 的 ContentPlaceHolder 控件。 不需要這個 ContentPlaceHolder 控件,因為內容頁面可以透過程式設計方式將自定義內容新增至 <head> 元素。 不過,在內容頁面需要將靜態標記新增至元素的情況下很有用,因為靜態標記可以宣告方式新增至 <head> 對應的 Content 控件,而不是以程式設計方式加入。

除了 <title> 元素和前端 ContentPlaceHolder 之外,主版頁面的 <head> 元素應該包含所有頁面通用的任何 <head>層級標記。 在我們的網站中,所有頁面都會使用 檔案中 Styles.css 定義的 CSS 規則。 因此,我們已更新<head>使用主版頁面建立 Site-Wide 版面配置教學課程中的 元素,以包含對應的<link>元素。 我們的 Site.master 主版頁面目前 <head> 標記如下所示。

<head runat="server">
 <title>Untitled Page</title>
 <asp:ContentPlaceHolder id="head" runat="server">
 </asp:ContentPlaceHolder>
 <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>

步驟 1:設定內容頁面的標題

網頁的標題是透過 <title> 元素來指定。 請務必將每個頁面的標題設定為適當的值。 瀏覽頁面時,其標題會顯示在瀏覽器的標題欄中。 此外,在為頁面加上書籤時,瀏覽器會使用頁面的標題作為書籤的建議名稱。 此外,許多搜尋引擎會在顯示搜尋結果時顯示頁面的標題。

注意

根據預設,Visual Studio 會將 <title> 主版頁面中的 元素設定為 “Untitled Page”。 同樣地,新的 ASP.NET 頁面也會將其 <title> 設定為 [未命名的頁面]。 因為很容易忘記將頁面的標題設定為適當的值,所以因特網上有許多頁面標題為「未命名頁面」。 搜尋 Google 尋找具有此標題的網頁會傳回大約 2,460,000 個結果。 即使是 Microsoft 也很容易發佈標題為「未命名頁面」的網頁。 在撰寫本文時,Google 搜尋在 Microsoft.com 網域中回報了 236 個這類網頁。

ASP.NET 頁面可以使用下列其中一種方式來指定其標題:

  • 直接將值放在 元素內<title>
  • Title在指示詞中使用 <%@ Page %> 屬性
  • 使用 或 Page.Header.Title="title"之類的Page.Title="title"程式代碼,以程式設計方式設定頁面Title的 屬性。

內容頁面沒有 <title> 元素,因為它定義於主版頁面中。 因此,若要設定內容頁面的標題,您可以使用 <%@ Page %> 指示詞的 Title 屬性,或以程序設計方式加以設定。

以宣告方式設定頁面的標題

您可以透過 Title 指示詞的 屬性,以宣告方式設定內容頁面的<%@ Page %>標題。 您可以直接修改 <%@ Page %> 指示詞或透過 屬性視窗 來設定這個屬性。 讓我們看看這兩種方法。

從 [來源] 檢視中,找出 <%@ Page %> 指示詞,該指示詞位於頁面的宣告式標記頂端。 的 <%@ Page %>Default.aspx 指示詞如下:

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %>

指示 <%@ Page %> 詞會指定剖析和編譯頁面時,ASP.NET 引擎所使用的頁面特定屬性。 這包括主版頁面檔案、程式代碼檔案的位置,以及其標題以及其他資訊。

根據預設,建立新的內容頁面 Visual Studio 時,會將 Title 屬性設定為 [未命名的頁面]。 將 的 Title 屬性從 [未命名的頁面] 變更Default.aspx為 [主版頁面教學課程],然後透過瀏覽器檢視頁面。 圖 1 顯示瀏覽器的標題列,其反映新的頁面標題。

瀏覽器的標題列現在會顯示「主版頁面教學課程」,而不是「未命名的頁面」

圖 01:瀏覽器的標題列現在會顯示「主版頁面教學課程」,而不是「未命名的頁面」

您也可以從 屬性視窗 設定頁面的標題。 從 屬性視窗,從下拉式清單中選取 [DOCUMENT],Title以載入包含 屬性的頁面層級屬性。 圖 2 顯示設定為「主版頁面教學課程」之後Title的 屬性視窗。

您也可以從屬性視窗設定標題

圖 02:您也可以從屬性視窗設定標題

以程式設計方式設定頁面的標題

當頁面由 ASP.NET 引擎轉譯時,主版頁面的 <head runat="server"> 標記會轉譯成 HtmlHead 類別 實例。 類別 HtmlHead 具有 Title 屬性 ,其值會反映在轉譯 <title> 的專案中。 這個屬性可以透過 Page.Header.Title從 ASP.NET 頁面的程式代碼後置類別存取;您也可以透過 存取 Page.Title這個相同的屬性。

若要練習以程式設計方式設定頁面的標題,請流覽至 About.aspx 頁面的程式代碼後置類別,並建立頁面 Load 事件的事件處理程式。 接下來,將頁面的標題設定為 「Master Page Tutorials :: About :: date“,其中 date 是目前的日期。 新增此程式代碼之後, Page_Load 事件處理程式看起來應該如下所示:

protected void Page_Load(object sender, EventArgs e)
{
    Page.Title = string.Format("Master Page Tutorials :: About :: {0:d}", DateTime.Now);
}

圖 3 顯示瀏覽頁面時的 About.aspx 瀏覽器標題列。

頁面的標題是以程序設計方式設定並包含目前的日期

圖 03:頁面的標題是以程式設計方式設定並包含目前的日期

步驟 2:自動指派頁面標題

如我們在步驟 1 中所見,頁面的標題可以宣告方式或以程式設計方式設定。 不過,如果您忘記將標題明確變更為更具描述性的內容,則您的頁面會有預設標題「未命名的頁面」。 在理想情況下,頁面的標題會在未明確指定其值的情況下自動設定給我們。 例如,如果在運行時間,頁面的標題是「未命名的頁面」,我們可能會想要讓標題自動更新為與 ASP.NET 頁面的檔名相同。 好消息是,在一些預先工作的情況下,可以自動指派標題。

所有 ASP.NET 網頁都衍生自 Page 命名空間中的 System.Web.UI 類別。 類別 Page 會定義 ASP.NET 頁面所需的最小功能,並公開其他許多屬性,例如 IsPostBackIsValidRequestResponse。 通常,Web 應用程式中的每個頁面都需要額外的特性或功能。 提供這個方法的常見方式是建立自定義基頁類別。 自定義基頁類別是您建立的類別,衍生自 Page 類別,並包含其他功能。 建立此基類之後,您可以讓 ASP.NET 頁面衍生自該頁面 (而非 Page 類別) ,進而將擴充功能提供給您的 ASP.NET 頁面。

在此步驟中,我們會建立基底頁面,如果尚未明確設定標題,則會自動將頁面的標題設定為 ASP.NET 頁的檔名。 步驟 3 會根據網站地圖來查看設定頁面的標題。

注意

建立和使用自定義基頁類別的徹底檢查超出本教學課程系列的範圍。

建立基底頁面類別

我們的第一個工作是建立基底頁面類別,這是擴充類別的 Page 類別。 首先,以App_Code滑鼠右鍵按下 方案總管 中的項目名稱,然後選擇 [新增 ASP.NET 資料夾],然後選取 App_Code。 接下來,以滑鼠右鍵按兩下 App_Code 資料夾,然後新增名為 BasePage.cs的新類別。 圖 4 顯示新增資料夾和BasePage.cs類別之後 App_Code 方案總管。

新增App_Code資料夾和名為BasePage的類別

圖 04:新增 App_Code 資料夾和名為 的類別 BasePage

注意

Visual Studio 支援兩種專案管理模式:網站專案和 Web 應用程式專案。 資料夾 App_Code 的設計目的是要與網站專案模型搭配使用。 如果您使用 Web 應用程式專案模型,請將 BasePage.cs 類別放在名為 以外的 App_Code資料夾,例如 Classes。 如需本主題的詳細資訊,請參閱 將網站專案移轉至 Web 應用程式專案

由於自定義基頁可作為 ASP.NET 頁面程序代碼後置類別的基類,因此必須擴充 Page 類別。

public class BasePage : System.Web.UI.Page
{

}

每當要求 ASP.NET 頁面時,就會繼續執行一系列階段,以將要求的頁面轉譯成 HTML。 我們可以藉由覆 Page 寫 類別的 OnEvent 方法,來點選階段。 在我們的基底頁面上,如果階段尚未明確指定 LoadComplete 標題,則會自動設定標題 (,因為您可能已猜到,會在階段之後發生 Load) 。

若要完成這項作業,請覆寫 OnLoadComplete 方法並輸入下列程序代碼:

protected override void OnLoadComplete(EventArgs e)
{
    // Set the page's title, if necessary
    if (string.IsNullOrEmpty(Page.Title) || Page.Title == "Untitled Page")
    {
        // Determine the filename for this page
        string fileName = System.IO.Path.GetFileNameWithoutExtension(Request.PhysicalPath);

        Page.Title = fileName;
    }

    base.OnLoadComplete(e);
}

方法 OnLoadComplete 會從判斷 Title 屬性是否尚未明確設定開始。 Title如果屬性為 null、空字串或具有值 「Untitled Page」,則會指派給所要求 ASP.NET 頁面的檔名。 所要求 ASP.NET 頁面的實體路徑 - C:\MySites\Tutorial03\Login.aspx例如 , 可透過 屬性存取 Request.PhysicalPath 。 方法 Path.GetFileNameWithoutExtension 用來只提取檔名部分,然後這個檔名會指派給 Page.Title 屬性。

注意

我邀請您增強此邏輯,以改善標題的格式。 例如,如果頁面的檔名是 Company-Products.aspx,上述程式代碼會產生標題 「Company-Products」,但理想情況下,虛線會取代為空格,如「公司產品」所示。 此外,請考慮在發生案例變更時新增空間。 也就是說,請考慮將檔名 OurBusinessHours.aspx 轉換成「我們的上班時間」標題的程序代碼。

讓內容頁面繼承基底頁面類別

我們現在需要更新網站中的 ASP.NET 頁面,以衍生自自定義基頁, (BasePage) 而不是 Page 類別。 若要達成此目的,請移至每個程式代碼後置類別,並從下列專案變更類別宣告:

public partial class ClassName : System.Web.UI.Page

變更為:

public partial class ClassName : BasePage

這麼做之後,請透過瀏覽器瀏覽網站。 如果您瀏覽的頁面已明確設定標題,例如 Default.aspxAbout.aspx,則會使用明確指定的標題。 不過,如果您瀏覽的頁面標題尚未從預設 (“Untitled Page”) 變更,基頁類別會將標題設定為頁面的檔名。

圖 5 顯示 MultipleContentPlaceHolders.aspx 透過瀏覽器檢視時的頁面。 請注意,標題是頁面的檔名, (擴展名小於 “MultipleContentPlaceHolders”) 。

如果未明確指定標題,則會自動使用頁面的檔名

圖 05:如果未明確指定標題,頁面的檔名會自動使用 (按兩下即可檢視完整大小的影像)

步驟 3:根據網站地圖上的頁面標題

ASP.NET 提供健全的網站地圖架構,可讓頁面開發人員在外部資源 (定義階層式網站地圖,例如 XML 檔案或資料庫數據表) ,以及顯示網站地圖 (的資訊,例如 SiteMapPath、Menu 和 TreeView 控件) 。

您也可以從 ASP.NET 頁面的程式代碼後置類別,以程式設計方式存取網站地圖結構。 如此一來,我們可以自動將頁面標題設定為網站地圖中對應節點的標題。 讓我們增強在步驟 2 中建立的 BasePage 類別,使其提供這項功能。 但首先,我們需要為網站建立網站地圖。

注意

本教學課程假設讀者已經熟悉 ASP。NET 的網站地圖功能。 如需使用網站地圖的詳細資訊,請參閱我的多部分文章系列 檢查 ASP。NET 的網站導覽

建立網站地圖

網站地圖系統建置在 提供者模型之上,可將網站地圖 API 與串行化記憶體與永續性存放區之間的網站地圖資訊邏輯分離。 .NET Framework 隨附 XmlSiteMapProvider 類別,這是預設的網站地圖提供者。 如其名稱所示, XmlSiteMapProvider 使用 XML 檔案作為其網站地圖存放區。 讓我們使用此提供者來定義網站地圖。

首先,在名為的網站根資料夾中 Web.sitemap建立網站地圖檔案。 若要達成此目的,請以滑鼠右鍵按兩下 方案總管中的網站名稱,選擇 [新增專案],然後選取 [網站地圖] 範本。 確定檔案已命名 Web.sitemap ,然後按兩下 [新增]。

將名為 Web.sitemap 的檔案新增至網站的根資料夾

圖 06:將名為 Web.sitemap 的檔案新增至網站的根資料夾, (按兩下即可檢視完整大小的影像)

將下列 XML 新增至 Web.sitemap 檔案:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
 <siteMapNode url="~/Default.aspx" title="Home">
 <siteMapNode url="~/About.aspx" title="About the Author" />
 <siteMapNode url="~/MultipleContentPlaceHolders.aspx" title="Using Multiple ContentPlaceHolder Controls" />
 </siteMapNode>
</siteMap>

此 XML 定義圖 7 所示的階層式網站地圖結構。

網站地圖目前由三個網站地圖節點組成

圖 07:網站地圖目前由三個網站地圖節點組成

我們將在未來的教學課程中更新網站地圖結構,因為我們新增了新的範例。

更新主版頁面以包含導覽 Web 控制件

既然我們已定義網站地圖,讓我們更新主版頁面以包含導覽 Web 控件。 具體而言,讓我們在 Lessons 區段中將 ListView 控件新增至左側數據行,以轉譯未排序的清單,其中包含網站地圖中定義之每個節點的清單專案。

注意

ListView 控件是 ASP.NET 3.5 版的新功能。 如果您使用舊版的 ASP.NET,請改用 Repeater 控件。

首先,從 Lessons 區段移除現有的未排序列表標記。 接下來,從 [工具箱] 拖曳 ListView 控件,並將它放在 Lessons 標題下方。 ListView 位於 [工具箱] 的 [數據] 區段中,以及其他檢視控件:GridView、DetailsView 和 FormView。 將 ListView 的 ID 屬性設定為 LessonsList

從 [數據源設定精靈] 中選擇將 ListView 系結至名為 LessonsDataSource的新 SiteMapDataSource 控制件。 SiteMapDataSource 控件會從網站地圖系統傳回階層式結構。

將 SiteMapDataSource 控制項系結至 LessonsList ListView 控制件

圖 08:將 SiteMapDataSource 控件系結至 LessonsList ListView 控件 (按兩下即可檢視完整大小的影像)

建立 SiteMapDataSource 控制件之後,我們需要定義 ListView 的範本,以便轉譯具有 SiteMapDataSource 控件所傳回之每個節點清單專案的未排序列表。 這可以使用下列範本標記來完成:

<asp:ListView ID="LessonsList" runat="server" DataSourceID="LessonsDataSource">
 <LayoutTemplate>
 <ul>
 <asp:PlaceHolder runat="server" ID="itemPlaceholder" />
 </ul>
 </LayoutTemplate>
 
 <ItemTemplate>
 <li><asp:HyperLink runat="server" ID="lnkLesson" NavigateUrl='<%# Eval("Url") %>'
 Text='<%# Eval("Title") %>' /></li>
 </ItemTemplate>
</asp:ListView>

會產生 LayoutTemplate 未排序列表的標記 (<ul>...</ul>) ,而 ItemTemplate 會將 SiteMapDataSource 傳回的每個專案轉譯為列表專案, <li> () 包含特定課程的連結。

設定 ListView 的範本之後,請瀏覽網站。 如圖 9 所示,Lessons 區段包含單一專案符號專案 Home。 About 和使用多個 ContentPlaceHolder 控件課程在哪裡? SiteMapDataSource 的設計目的是要傳回一組階層式數據集,但 ListView 控件只能顯示階層的單一層級。 因此,只會顯示 SiteMapDataSource 所傳回的第一層網站地圖節點。

Lessons 區段包含單一列表專案

圖 09:課程區段包含單一列表專案 (按兩下即可檢視完整大小的影像)

為了顯示多個層級,我們可以在 內 ItemTemplate巢狀多個 ListView。 這項技術已在我的使用數據教學課程系列的主版頁面和網站導覽教學課程中檢查。 不過,在本教學課程系列中,網站地圖只會包含兩個層級:首頁 (最上層) ;和每一課都是 Home 的子系。 我們可以改為指示 SiteMapDataSource 不要透過將其 ShowStartingNode 屬性 設定為 false來傳回起始節點,而不是製作巢狀 ListView。 淨效果是 SiteMapDataSource 一開始會傳回網站地圖節點的第二層。

有了這項變更,ListView 會顯示 About 和 Using Multiple ContentPlaceHolder Controls 課程的專案符號專案,但省略 Home 的專案符號專案。 若要解決此問題,我們可以在 中 LayoutTemplate明確新增 Home 的專案符號專案:

<LayoutTemplate>
 <ul>
 <li><asp:HyperLink runat="server" ID="lnkLesson"
 NavigateUrl="~/Default.aspx" Text="Home" /></li>
 <asp:PlaceHolder runat="server" ID="itemPlaceholder" />
 </ul>
</LayoutTemplate>

藉由將 SiteMapDataSource 設定為省略起始節點並明確新增首頁專案符號專案,Lessons 區段現在會顯示預期的輸出。

Lessons 區段包含首頁和每個子節點的項目符號專案

圖 10:[課程] 區段包含 [首頁] 和 [每個子節點] 的項目符號專案, (按兩下即可檢視完整大小的影像)

根據網站地圖設定標題

有了網站地圖,我們可以更新 類別 BasePage ,以使用網站地圖中指定的標題。 如同我們在步驟 2 中所做的一樣,只有當頁面的標題尚未由頁面開發人員明確設定時,才想要使用網站地圖節點的標題。 如果所要求的頁面沒有明確設定的頁面標題,而且在網站地圖中找不到,我們將會回到使用要求的網頁檔名, (的擴展名) 較少,如同我們在步驟 2 中所做的一樣。 圖 11 說明此決策程式。

如果沒有明確設定的頁面標題,則會使用對應的網站地圖節點標題

圖 11:如果沒有明確設定的頁面標題,則會使用對應的網站地圖節點標題

BasePage更新類別的 OnLoadComplete 方法以包含下列程式代碼:

protected override void OnLoadComplete(EventArgs e)
{
    // Set the page's title, if necessary
    if (string.IsNullOrEmpty(Page.Title) || Page.Title == "Untitled Page")
    {
        // Is this page defined in the site map?
        string newTitle = null;

        SiteMapNode current = SiteMap.CurrentNode;
        if (current != null)
        {
            newTitle = current.Title;
        }
        else
        {
            // Determine the filename for this page
            newTitle = System.IO.Path.GetFileNameWithoutExtension(Request.PhysicalPath);
        }

        Page.Title = newTitle;
    }

    base.OnLoadComplete(e);
}

如同先前,方法會 OnLoadComplete 從判斷是否已明確設定頁面的標題開始。 如果 Page.Titlenull,則為 、空字串,或被指派 「Untitled Page」 值,則程式代碼會自動將值指派給 Page.Title

若要判斷要使用的標題,程式代碼會從參考 SiteMap 類別CurrentNode 屬性開始。 CurrentNodeSiteMapNode會傳回對應至目前要求頁面之網站地圖中的實例。 假設網站地圖內找到目前要求的頁面, SiteMapNode則會 Title 將 的屬性指派給頁面的標題。 如果目前要求的頁面不在網站地圖中, CurrentNode 則會傳回 null 要求頁面的檔名做為標題 (,如步驟 2) 所示。

圖 12 顯示 MultipleContentPlaceHolders.aspx 透過瀏覽器檢視時的頁面。 由於此頁面的標題未明確設定,因此會改用其對應的網站地圖節點標題。

MultipleContentPlaceHolders.aspx頁面的標題是從網站地圖提取

圖 12:頁面 MultipleContentPlaceHolders.aspx 的標題是從網站地圖提取

步驟 4:將其他 Page-Specific 標記新增至 區<head>

步驟 1、2 和 3 會逐頁查看自定義 <title> 元素。 除了 <title>之外,區 <head> 段可能包含 <meta> 元素和 <link> 元素。 如本教學課程稍早所述, Site.master『s <head> 區段包含 <link> 的專案至 Styles.css。 因為這個專案 <link> 是在主版頁面中定義,所以它會包含在所有內容頁面的 <head> 區段中。 但如何逐頁新增 <meta><link> 元素?

將頁面特定內容新增至 <head> 區段的最簡單方式是在主版頁面中建立 ContentPlaceHolder 控件。 我們已經有名為) 的 ContentPlaceHolder (head 。 因此,若要新增自定義 <head> 標記,請在頁面中建立對應的內容控件,並將標記放在該處。

為了說明將自定義 <head> 標記新增至頁面,讓我們將描述元素納入 <meta> 目前的內容頁面集。 <meta> description 元素提供網頁的簡短描述;大部分的搜尋引擎會在顯示搜尋結果時以某種形式納入這項資訊。

<meta> description 元素的格式如下:

<meta name="description" content="description of the web page" />

若要將此標記新增至內容頁面,請將上述文字新增至對應至主版頁面前端 ContentPlaceHolder 的內容控件。 例如,若要定義 <meta> 的描述 Default.aspx專案,請新增下列標記:

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
 <meta name="description" content="Welcome to Scott Mitchell's Master Page Tutorials series." />
</asp:Content>

因為前端 ContentPlaceHolder 不在 HTML 頁面的本文內,所以新增至內容控件的標記不會顯示在 [設計] 檢視中。 <meta>若要查看 description 元素,請瀏覽Default.aspx瀏覽器。 載入頁面之後,請檢視來源,並注意 區 <head> 段包含內容控件中指定的標記。

花點時間將描述專案新增 <meta>About.aspxMultipleContentPlaceHolders.aspxLogin.aspx

以程序設計方式將標記新增至<head>區域

前端 ContentPlaceHolder 可讓我們以宣告方式將自定義標記新增至主版頁面 <head> 的區域。 您也可以以程式設計方式新增自訂標記。 回想一下,類別 PageHeader 屬性會傳回 HtmlHead 主版頁面中定義的實例, <head runat="server"> () 。

當要新增的內容是動態時,能夠以程序設計方式將內容新增至 <head> 區域很有用。 可能是以瀏覽頁面的用戶為基礎;可能是從資料庫提取。 不論原因為何,您可以將控件新增至其 Controls 集合,將內容 HtmlHead 新增至 ,如下所示:

// Programmatically add a <meta> element to the Header
HtmlMeta keywords = new HtmlMeta();
keywords.Name = "keywords";
keywords.Content = "master page,asp.net,tutorial";

Page.Header.Controls.Add(keywords);

上述程式代碼會將 <meta> keywords元素新增至 <head> 區域,其提供描述頁面的逗號分隔關鍵詞清單。 請注意,若要新增標記 <meta> ,請建立 HtmlMeta 實例、設定其 NameContent 屬性,然後將它新增至 HeaderControls 集合。 同樣地,若要以程序設計方式新增 <link> 專案、建立 HtmlLink 對象、設定其屬性,然後將它新增至 HeaderControls 集合。

注意

若要新增任意標記,請建立 LiteralControl 實例、設定其 Text 屬性,然後將它新增至 HeaderControls 集合。

摘要

在本教學課程中,我們探討各種方式,以逐頁方式新增 <head> 區域標記。 主版頁面應該包含具有 HtmlHead ContentPlaceHolder) <head runat="server"> 的實例 (。 HtmlHead實例可讓內容頁以程序設計方式存取<head>區域,並以宣告方式和以程式設計方式設定頁面的標題;ContentPlaceHolder 控件可透過內容控件以宣告方式將自定義標記新增至<head>區段。

快樂的程序設計!

深入閱讀

如需本教學課程中討論之主題的詳細資訊,請參閱下列資源:

關於作者

Scott Mitchell 是多個 ASP/ASP.NET 書籍的作者,且 4GuysFromRolla.com 的作者,自 1998 年以來,已與 Microsoft Web 技術合作。 Scott 是獨立顧問、訓練員和作者。 他的最新書籍是 Sams 在 24 小時內自行 ASP.NET 3.5。 您可以在 或 透過在 的http://ScottOnWriting.NET部落格連線mitchell@4GuysFromRolla.com到 Scott。

特別感謝

本教學課程系列是由許多實用的檢閱者檢閱。 本教學課程的首席檢閱者是 Zack Jones 和 Suchi Banerjee。 有興趣檢閱即將推出的 MSDN 文章嗎? 如果是,請將一行 mitchell@4GuysFromRolla.com放在 。