次の方法で共有


マスター ページでタイトル、メタ タグ、その他の HTML ヘッダーを指定する (C#)

作成者: Scott Mitchell

PDF のダウンロード

コンテンツ ページからマスター ページでさまざまな <ヘッド> 要素を定義するためのさまざまな手法について説明します。

はじめに

Visual Studio 2008 で作成された新しいマスター ページには、既定で 2 つの ContentPlaceHolder コントロールがあります。1 つは head という名前で、もう 1 つは 要素に <head> 配置され、もう 1 つは という名前 ContentPlaceHolder1の コントロールが Web フォーム内に配置されます。 の ContentPlaceHolder1 目的は、ページ単位でカスタマイズできる領域を Web フォームで定義することです。 head ContentPlaceHolder を使用すると、ページでカスタム コンテンツをセクションに<head>追加できます。 (もちろん、これら 2 つの ContentPlaceHolder は変更または削除でき、さらに ContentPlaceHolder をマスター ページに追加することもできます。現在、 Site.masterマスター ページには 4 つの ContentPlaceHolder コントロールがあります)。

HTML <head> 要素は、ドキュメント自体の一部ではない Web ページ ドキュメントに関する情報のリポジトリとして機能します。 これには、Web ページのタイトル、検索エンジンまたは内部クローラーで使用されるメタ情報、RSS フィード、JavaScript、CSS ファイルなどの外部リソースへのリンクなどの情報が含まれます。 この情報の一部は、Web サイト内のすべてのページに関連している可能性があります。 たとえば、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 ページは、 名前空間にある System.Web.UIPage クラスから派生します。 このクラスには、ページの Header 領域へのアクセスを提供するプロパティが <head> 含まれています。 プロパティをHeader使用して、ASP.NET ページのタイトルを設定したり、レンダリングされた<head>セクションにマークアップを追加したりできます。 その後、ページのイベント ハンドラーにコードの <head> ビットを記述することで、コンテンツ ページの Page_Load 要素をカスタマイズできます。 手順 1 でページのタイトルをプログラムで設定する方法について説明します。

上の要素に示されている <head> マークアップには、head という名前の ContentPlaceHolder コントロールも含まれています。 コンテンツ ページはプログラムによって要素にカスタム コンテンツを <head> 追加できるため、この ContentPlaceHolder コントロールは必要ありません。 ただし、静的マークアップをプログラムではなく対応するコンテンツ コントロールに宣言的に <head> 追加できるため、コンテンツ ページで要素に静的マークアップを追加する必要がある場合に便利です。

要素とヘッド ContentPlaceHolder <title> に加えて、マスター ページの <head> 要素には、すべてのページに共通するレベルのマークアップが含まれている <head>必要があります。 この Web サイトでは、すべてのページで ファイルで定義されている CSS 規則が Styles.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: コンテンツ ページのタイトルを設定する

Web ページのタイトルは、 要素を <title> 使用して指定します。 各ページのタイトルを適切な値に設定することが重要です。 ページにアクセスすると、そのタイトルがブラウザーのタイトル バーに表示されます。 さらに、ページをブックマークするときに、ブラウザーはブックマークの候補名としてページのタイトルを使用します。 また、多くの検索エンジンでは、検索結果を表示するときにページのタイトルが表示されます。

注意

既定では、Visual Studio はマスター ページの 要素を "無題のページ" に設定 <title> します。 同様に、新しい ASP.NET ページも <title> "無題のページ" に設定されています。 ページのタイトルを適切な値に設定することは忘れやすくなるため、インターネットには "無題のページ" というタイトルのページが多数あります。 Google でこのタイトルの Web ページを検索すると、約 2,460,000 件の結果が返されます。 Microsoft でも、"無題のページ" というタイトルの Web ページを公開する可能性があります。 この執筆時点で、Google 検索では、Microsoft.com ドメイン内のこのような Web ページが 236 件報告されました。

ASP.NET ページでは、次のいずれかの方法でタイトルを指定できます。

  • 要素内に値を <title> 直接配置する
  • ディレクティブで Title 属性を使用する<%@ Page %>
  • や などのPage.Title="title"コードを使用して、ページのTitleプロパティをプログラムで設定しますPage.Header.Title="title"

コンテンツ ページには、マスター ページで <title> 定義されているため、要素はありません。 したがって、コンテンツ ページのタイトルを設定するには、 ディレクティブの Title 属性を<%@ Page %>使用するか、プログラムで設定します。

ページのタイトルを宣言的に設定する

コンテンツ ページのタイトルは、 ディレクティブの <%@ Page %>属性をTitle使用して宣言的に設定できます。 このプロパティは、 ディレクティブを直接変更するか、<%@ Page %>プロパティ ウィンドウを使用して設定できます。 両方のアプローチを見てみましょう。

[ソース] ビューで、ページの <%@ Page %> 宣言型マークアップの上部にある ディレクティブを見つけます。 の ディレクティブDefault.aspx<%@ Page %>次のとおりです。

<%@ 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: ブラウザーのタイトル バーに、"無題のページ" ではなく "マスター ページチュートリアル" が表示されるようになりました

ページのタイトルは、プロパティ ウィンドウから設定することもできます。 プロパティ ウィンドウから、ドロップダウン リストから [ドキュメント] を選択して、 プロパティを含むページ レベルのプロパティをTitle読み込みます。 図 2 は、"マスター ページチュートリアル" に設定された後Titleのプロパティ ウィンドウを示しています。

[プロパティ] ウィンドウからタイトルを構成することもできます

図 02: [プロパティ] ウィンドウからタイトルを構成することもできます

プログラムでページのタイトルを設定する

マスター ページの<head runat="server">マークアップは、ページが ASP.NET エンジンによってレンダリングされるときにクラス インスタンスに変換HtmlHeadされます。 HtmlHeadクラスには、Titleレンダリングされた<title>要素に反映される値を持つ プロパティがあります。 このプロパティは、 を介して Page.Header.TitleASP.NET ページの分離コード クラスからアクセスできます。この同じプロパティには、 を使用して Page.Titleアクセスすることもできます。

ページのタイトルをプログラムで設定する練習を行うために、ページの分離コード クラスに About.aspx 移動し、ページの Load イベントのイベント ハンドラーを作成します。 次に、ページのタイトルを "マスター ページチュートリアル :: 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 Web ページは、 名前空間の PageSystem.Web.UI クラスから派生します。 クラスはPage、ASP.NET ページに必要な最小限の機能を定義し、、IsValidRequestResponseなどのIsPostBack重要なプロパティを公開します。 多くの場合、Web アプリケーション内のすべてのページには、追加の機能が必要です。 これを提供する一般的な方法は、カスタム基本ページ クラスを作成することです。 カスタム 基本ページ クラスは、 クラスから派生し、追加の機能を含む、作成する Page クラスです。 この基底クラスが作成されたら、(クラスではなく Page ) ASP.NET ページを派生させ、拡張機能を 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 サイト プロジェクトと Web アプリケーション プロジェクトの 2 つのモードのプロジェクト管理がサポートされています。 フォルダーは App_Code 、Web サイト プロジェクト モデルで使用するように設計されています。 Web アプリケーション プロジェクト モデルを使用している場合は、 など、 以外App_CodeClassesの名前のフォルダーに クラスを配置BasePage.csします。 このトピックの詳細については、「 Web サイト プロジェクトを Web アプリケーション プロジェクトに移行する」を参照してください。

カスタム 基本ページは、ASP.NET ページの分離コード クラスの基本クラスとして機能するため、 クラスを Page 拡張する必要があります。

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

}

ASP.NET ページが要求されるたびに、一連のステージを経て、要求されたページが HTML にレンダリングされます。 クラスOnEventの メソッドをオーバーライドすることで、ステージをPageタップできます。 基本ページでは、ステージで明示的に指定されていない場合は、タイトルを 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 設定されていないかどうかを判断することから始めます。 プロパティが Titlenull、空の文字列、または値が "Untitled Page" の場合は、要求された ASP.NET ページのファイル名に割り当てられます。 要求された ASP.NET ページへの物理パス ( C:\MySites\Tutorial03\Login.aspxなど) には、 プロパティを Request.PhysicalPath 使用してアクセスできます。 Path.GetFileNameWithoutExtensionメソッドを使用してファイル名の部分だけをプルし、このファイル名を プロパティにPage.Title割り当てます。

注意

タイトルの形式を改善するために、このロジックを強化するようお勧めします。 たとえば、ページのファイル名が の場合、 Company-Products.aspx上記のコードは "Company-Products" というタイトルを生成しますが、"Company Products" のようにダッシュをスペースに置き換えるのが理想的です。 また、大文字と小文字が変わるたびにスペースを追加することを検討してください。 つまり、ファイル名 OurBusinessHours.aspx を "Our Business Hours" というタイトルに変換するコードを追加することを検討してください。

コンテンツ ページで基本ページ クラスを継承する

ここでは、 クラスではなくカスタム ベース ページ (BasePage) から派生するように、サイト内の ASP.NET ページを更新する Page 必要があります。 これを実現するには、各分離コード クラスに移動し、クラス宣言を次から変更します。

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

移動先:

public partial class ClassName : BasePage

その後、ブラウザーからサイトにアクセスします。 や About.aspxなどDefault.aspx、タイトルが明示的に設定されているページにアクセスすると、明示的に指定されたタイトルが使用されます。 ただし、タイトルが既定 ("無題のページ" から変更されていないページ) にアクセスすると、基本ページ クラスによってタイトルがページのファイル名に設定されます。

図 5 は、ブラウザーを MultipleContentPlaceHolders.aspx 介して表示されるページを示しています。 タイトルは正確にページのファイル名 (拡張子は小さい)、"MultipleContentPlaceHolders" であることに注意してください。

タイトルが明示的に指定されていない場合、ページのファイル名は自動的に使用されます

図 05: タイトルが明示的に指定されていない場合、ページのファイル名が自動的に使用されます (フルサイズの画像を表示する をクリックします)。

手順 3: サイト マップのページ タイトルに基づく

ASP.NET は、ページ開発者がサイト マップに関する情報 (SiteMapPath、Menu、TreeView コントロールなど) を表示するための Web コントロールと共に、外部リソース (XML ファイルやデータベース テーブルなど) に階層サイト マップを定義できるようにする堅牢なサイト マップ フレームワークを提供します。

サイト マップ構造には、ASP.NET ページの分離コード クラスからプログラムからアクセスすることもできます。 この方法では、ページのタイトルをサイト マップ内の対応するノードのタイトルに自動的に設定できます。 手順 2 で作成したクラスを BasePage 拡張して、この機能を提供できるようにします。 ただし、最初にサイトのサイト マップを作成する必要があります。

注意

このチュートリアルでは、読者が既に ASP に精通していることを前提としています。NET のサイト マップ機能。 サイト マップの使用の詳細については、マルチパートの記事シリーズ「 ASP の確認」を参照してください。NET のサイト ナビゲーション

サイト マップの作成

サイト マップ システムは プロバイダー モデルの上に構築されています。これにより、サイト マップ API が、メモリと永続ストアの間でサイト マップ情報をシリアル化するロジックから切り離されます。 .NET Frameworkには、既定のXmlSiteMapProviderサイト マップ プロバイダーである クラスが付属しています。 その名前が示すように、 XmlSiteMapProvider XML ファイルをサイト マップ ストアとして使用します。 このプロバイダーを使用して、サイト マップを定義してみましょう。

まず、 という名前 Web.sitemapの Web サイトのルート フォルダーにサイト マップ ファイルを作成します。 これを行うには、ソリューション エクスプローラーの Web サイト名を右クリックし、[新しい項目の追加] を選択して、[サイト マップ] テンプレートを選択します。 ファイルに名前が付 Web.sitemap けられていることを確認し、[追加] をクリックします。

Web.sitemap という名前のファイルを Web サイトのルート フォルダーに追加する

図 06: Web サイトのルート フォルダーにという名前 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 に示す階層サイト マップ構造を定義します。

サイト マップは現在、3 つのサイト マップ ノードで構成されています

図 07: 現在、サイト マップは 3 つのサイト マップ ノードで構成されています

新しい例を追加する場合は、今後のチュートリアルでサイト マップ構造を更新します。

ナビゲーション Web コントロールを含むようにマスター ページを更新する

サイト マップが定義されたので、ナビゲーション Web コントロールを含むようにマスター ページを更新しましょう。 具体的には、Lessons セクションの左側の列に ListView コントロールを追加し、サイト マップで定義されている各ノードのリスト アイテムを含む順序なしのリストをレンダリングします。

注意

ListView コントロールは、ASP.NET バージョン 3.5 の新機能です。 以前のバージョンの ASP.NET を使用している場合は、代わりに Repeater コントロールを使用してください。

まず、Lessons セクションから既存の順序付けられていないリスト マークアップを削除します。 次に、[ツールボックス] から ListView コントロールをドラッグし、[レッスン] 見出しの下にドロップします。 ListView は、他のビュー コントロール (GridView、DetailsView、FormView) と共に、ツールボックスの [データ] セクションにあります。 ListView の ID プロパティを に設定します LessonsList

データ ソース構成ウィザードで、ListView を という名前 LessonsDataSourceの新しい SiteMapDataSource コントロールにバインドすることを選択します。 SiteMapDataSource コントロールは、サイト マップ システムから階層構造を返します。

SiteMapDataSource コントロールを LessonsList ListView コントロールにバインドする

図 08: SiteMapDataSource コントロールを ListView コントロールに LessonsList バインドする (フルサイズの画像を表示する をクリックします)

SiteMapDataSource コントロールを作成した後、SiteMapDataSource コントロールによって返される各ノードのリスト アイテムを含む順序なしのリストをレンダリングするように、ListView のテンプレートを定義する必要があります。 これは、次のテンプレート マークアップを使用して実現できます。

<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 のテンプレートを構成したら、Web サイトにアクセスします。 図 9 に示すように、[レッスン] セクションには 1 つの箇条書きの項目 Home が含まれています。 About と Using Multiple ContentPlaceHolder Controls レッスンはどこにありますか? SiteMapDataSource は、階層的なデータ セットを返すように設計されていますが、ListView コントロールは階層の 1 つのレベルのみを表示できます。 したがって、SiteMapDataSource によって返されるサイト マップ ノードの最初のレベルのみが表示されます。

[レッスン] セクションには、1 つのリスト アイテムが含まれています

図 09: [レッスン] セクションには 1 つのリスト アイテムが含まれています (クリックするとフルサイズの画像が表示されます)

複数のレベルを表示するには、 内に複数の ListView を入れ子にすることができます ItemTemplate。 この手法は、データの操作に関するチュートリアル シリーズのマスター ページとサイト ナビゲーションのチュートリアルで確認しました。 ただし、このチュートリアル シリーズでは、サイト マップには次の 2 つのレベルだけが含まれます。家庭の子供としての各レッスン。 入れ子になった ListView を作成するのではなく、そのプロパティを に設定ShowStartingNodeして開始ノードを返さないように SiteMapDataSource にfalse指示できます。 その結果、SiteMapDataSource はサイト マップ ノードの第 2 層を返すことによって開始されます。

この変更により、ListView では About レッスンと Using Multiple ContentPlaceHolder Controls レッスンの箇条書き項目が表示されますが、Home の箇条書き項目は省略されます。 これを解決するために、 で Home の箇条書き項目を明示的に LayoutTemplate追加できます。

<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 セクションに目的の出力が表示されるようになりました。

[レッスン] セクションには、ホームノードと各子ノードの箇条書き項目が含まれています

図 10: レッスン セクションには、ホームと各子ノードの箇条書き項目が含まれています (フルサイズの画像を表示する をクリックします)。

サイト マップに基づいてタイトルを設定する

サイト マップを配置すると、サイト マップで指定されたタイトルを使用するようにクラスを更新 BasePage できます。 手順 2 で行ったように、ページのタイトルがページ開発者によって明示的に設定されていない場合にのみ、サイト マップ ノードのタイトルを使用します。 要求されているページに明示的に設定されたページ タイトルが含まれず、サイト マップに見つからない場合は、手順 2 で行ったように、要求されたページのファイル名 (拡張子が小さいもの) を使用してフォールバックします。 図 11 は、この決定プロセスを示しています。

明示的に設定されたページ タイトルがない場合は、対応するサイト マップ ノードのタイトルが使用されます

図 11: 明示的に設定されたページ タイトルがない場合は、対応するサイト マップ ノードのタイトルが使用されます

クラスの OnLoadComplete メソッドをBasePage更新して、次のコードを含めます。

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 、ページのタイトルが明示的に設定されているかどうかを判断することから始まります。 が nullの場合、空の文字列、または値 "Untitled Page" が割り当てられている場合Page.Title、コードは 値を に自動的にPage.Title割り当てます。

使用するタイトルを決定するために、コードはクラスの CurrentNode プロパティSiteMap参照することから始まります。 CurrentNode は、 SiteMapNode 現在要求されているページに対応するサイト マップ内のインスタンスを返します。 現在要求されているページがサイト マップ内にあると仮定すると、 SiteMapNodeTitle プロパティはページのタイトルに割り当てられます。 現在要求されているページがサイト マップにない場合は、 が返nullされ、CurrentNode要求されたページのファイル名がタイトルとして使用されます (手順 2 で行ったとおり)。

図 12 は、ブラウザーを MultipleContentPlaceHolders.aspx 介して表示されるページを示しています。 このページのタイトルは明示的に設定されていないため、対応するサイト マップ ノードのタイトルが代わりに使用されます。

MultipleContentPlaceHolders.aspx ページのタイトルがサイト マップからプルされる

図 12: MultipleContentPlaceHolders.aspx ページのタイトルがサイト マップからプルされる

手順 4: セクションに他の Page-Specific マークアップを追加する<head>

手順 1、2、3 では、要素を <title> ページ単位でカスタマイズする方法について説明しました。 に<title>加えて、セクションには<head>要素と要素を<link><meta>めることができます。 このチュートリアルで前に説明したように、 Site.master<head> セクションには へのStyles.css要素が<link>含まれています。 この <link> 要素はマスター ページ内で定義されているため、すべてのコンテンツ ページの セクションに <head> 含まれます。 しかし、ページ単位で 要素と <link> 要素を追加<meta>するにはどうすればよいでしょうか。

ページ固有のコンテンツをセクションに追加する <head> 最も簡単な方法は、マスター ページに ContentPlaceHolder コントロールを作成することです。 このような ContentPlaceHolder (という名前 head) が既にあります。 そのため、カスタム <head> マークアップを追加するには、対応するコンテンツ コントロールをページに作成し、そこにマークアップを配置します。

カスタム <head> マークアップをページに追加する方法を説明するために、現在のコンテンツ ページのセットに description 要素を含 <meta> めます。 description 要素は <meta> 、Web ページに関する簡単な説明を提供します。ほとんどの検索エンジンは、検索結果を表示するときにこの情報を何らかの形式で組み込みます。

<meta> description 要素の形式は次のとおりです。

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

このマークアップをコンテンツ ページに追加するには、マスター ページのヘッド ContentPlaceHolder にマップされる Content コントロールに上記のテキストを追加します。 たとえば、 の description 要素Default.aspx<meta>定義するには、次のマークアップを追加します。

<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 ページの本文内にないため、Content コントロールに追加されたマークアップはデザイン ビューに表示されません。 description 要素を表示するには、 <meta> ブラウザーからアクセス Default.aspx します。 ページが読み込まれたら、ソースを表示し、セクションに <head> Content コントロールで指定されたマークアップが含まれていることに注意してください。

説明要素を 、MultipleContentPlaceHolders.aspx、および Login.aspxに追加<meta>しますAbout.aspx

プログラムによってリージョンにマークアップを追加する<head>

ヘッド ContentPlaceHolder を使用すると、カスタム マークアップをマスター ページの <head> 領域に宣言的に追加できます。 カスタム マークアップは、プログラムによって追加することもできます。 クラスの PageHeader プロパティは、マスター ページ (<head runat="server">) で定義されているHtmlHeadインスタンスを返します。

プログラムによってリージョンにコンテンツを追加できることは、追加する <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> 記述する <head> キーワードのコンマ区切りのリストを提供する keywords 要素をリージョンに追加します。 タグを追加<meta>するには、インスタンスをHtmlMeta作成し、その Name インスタンスと Content プロパティを設定し、それを のControlsコレクションにHeader追加します。 同様に、プログラムで 要素を<link>追加するには、オブジェクトをHtmlLink作成し、そのプロパティを設定して、 のControlsコレクションにHeader追加します。

注意

任意のマークアップを追加するには、インスタンスをLiteralControl作成し、そのプロパティをText設定して、 のControlsコレクションにHeader追加します。

まとめ

このチュートリアルでは、ページごとにリージョン マークアップを追加 <head> するさまざまな方法について説明しました。 マスター ページには、ContentPlaceHolder を HtmlHead 持つインスタンス (<head runat="server">) を含める必要があります。 インスタンスを HtmlHead 使用すると、コンテンツ ページはプログラムによって領域にアクセス <head> し、ページのタイトルを宣言的およびプログラムによって設定できます。ContentPlaceHolder コントロールを使用すると、Content コントロールを使用してカスタム マークアップを <head> セクションに宣言的に追加できます。

幸せなプログラミング!

もっと読む

このチュートリアルで説明するトピックの詳細については、次のリソースを参照してください。

著者について

複数の ASP/ASP.NET 書籍の著者であり、4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジと協力しています。 Scott は独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズ・ティーチ・イン・ヒア ASP.NET 24時間で3.5です。 Scott は、 または mitchell@4GuysFromRolla.com のブログを http://ScottOnWriting.NET介してアクセスできます。

特別な感謝

このチュートリアル シリーズは、多くの役立つ校閲者によってレビューされました。 このチュートリアルのリード レビュー担当者は、Zack Jones と Suchi Banerjee でした。 今後の MSDN 記事の確認に関心がありますか? その場合は、 に行 mitchell@4GuysFromRolla.comをドロップしてください。