ASP.NET マスター ページの概要
更新 : 2007 年 11 月
ASP.NET マスタ ページでは、アプリケーションのページに一貫性のあるレイアウトを作成できます。アプリケーション内のすべてのページ (またはページのグループ) に対する任意の外観と操作性、および標準動作が 1 つのマスタ ページで定義されます。その後で、表示するコンテンツを含む個々のコンテンツ ページを作成できます。ユーザーがコンテンツ ページを要求すると、マスターページとマージされて、マスタ ページのレイアウトとコンテンツ ページのコンテンツが結合された出力が生成されます。
マスタ ページのしくみ
マスタ ページは、実際にはマスタ ページそのものと、1 つ以上のコンテンツ ページで構成されています。
メモ : |
---|
また、マスタ ページは入れ子にできます。詳細については、「入れ子にされた ASP.NET マスタ ページ」を参照してください。 |
マスタ ページ
マスタ ページは拡張子が .master の ASP.NET ファイル (MySite.master など) で、静的テキスト、HTML 要素、およびサーバー コントロールを含む定義済みレイアウトを持ちます。マスタ ページは、普通の .aspx ページに使用される @ Page ディレクティブではなく特別な @ Master ディレクティブによって識別されます。ディレクティブは次のようになります。
<%@ Master Language="VB" %>
<%@ Master Language="C#" %>
@ Master ディレクティブには @ Control ディレクティブに含めることができるディレクティブのほとんどを含めることができます。たとえば、次のマスタ ページ ディレクティブは、分離コード ファイルの名前を含み、クラス名をマスタ ページに割り当てます。
<%@ Master Language="VB" CodeFile="MasterPage.master.vb" Inherits="MasterPage" %>
<%@ Master Language="C#" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>
@ Master ディレクティブに加えて、マスタ ページは html、head、および form など、ページのすべての最上位 HTML 要素も含みます。たとえば、マスタ ページでは、レイアウトに HTML テーブル、会社ロゴに img 要素、著作権表記に静的テキスト、そしてサイトの標準ナビゲーションを作成するためのサーバー コントロールを使用できます。任意の HTML 要素と ASP.NET 要素をマスタ ページの一部として使用できます。
置き換え可能なコンテンツ プレースホルダ
すべてのページに表示される静的テキストとコントロールの他に、マスタ ページには 1 つ以上の ContentPlaceHolder コントロールも含まれます。これらのプレースホルダ コントロールは、置き換え可能なコンテンツが表示される領域を定義します。次に、置き換え可能なコンテンツはコンテンツ ページで定義されます。ContentPlaceHolder コントロールを定義すると、マスタ ページは次のようになります。
<% @ Master Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML
1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server" >
<title>Master page title</title>
</head>
<body>
<form id="form1" runat="server">
<table>
<tr>
<td><asp:contentplaceholder id="Main" runat="server" /></td>
<td><asp:contentplaceholder id="Footer" runat="server" /></td>
</tr>
</table>
</form>
</body>
</html>
<%@ Master Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML
1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server" >
<title>Master page title</title>
</head>
<body>
<form id="form1" runat="server">
<table>
<tr>
<td><asp:contentplaceholder id="Main" runat="server" /></td>
<td><asp:contentplaceholder id="Footer" runat="server" /></td>
</tr>
</table>
</form>
</body>
</html>
コンテンツ ページ
マスタ ページのプレースホルダ コントロールのコンテンツを個々のコンテンツ ページを作成することによって定義します。個々のコンテンツ ページとは特定のマスタ ページにバインドされている ASP.NET ページ (.aspx ファイル、およびオプションで分離コード ファイル) です。バインディングは、使用されるマスタ ページを指定する MasterPageFile 属性を含めることによって、コンテンツ ページの @ Page ディレクティブで確立されます。たとえば、コンテンツ ページには次のような @ Page ディレクティブを含めることができます。このディレクティブはコンテンツ ページを Master1.master ページにバインドします。
<%@ Page Language="VB" MasterPageFile="~/MasterPages/Master1.master" Title="Content Page" %>
<%@ Page Language="C#" MasterPageFile="~/MasterPages/Master1.master" Title="Content Page"%>
コンテンツ ページでは、Content コントロールを追加し、これらをマスタ ページの ContentPlaceHolder コントロールに割り当てることによってコンテンツを作成します。たとえば、マスタ ページに Main とFooter というコンテンツ プレースホルダが含まれるとします。このコンテンツ ページには 2 つの Content コントロールを作成できます。次の図に示すように、1 つは ContentPlaceHolder の Main コントロールに割り当てられ、もう 1 つは ContentPlaceHolder の Footer コントロールに割り当てられます。
プレースホルダ コンテンツの置き換え
Content コントロールを作成した後で、これらのコントロールにテキストとコントロールを追加します。コンテンツ ページでは、Content コントロール内にないもの (サーバー コードのスクリプト ブロックを除く) はエラーとなります。コンテンツ ページでは、ASP.NET ページで実行できるタスクはすべて実行できます。たとえば、サーバー コントロールとデータベース クエリ、またはその他の動的な機構を使用して Content コントロールのコンテンツを生成できます。
コンテンツ ページは、たとえば次のようになります。
<% @ Page Language="VB" MasterPageFile="~/Master.master" Title="Content Page 1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="Main" Runat="Server">
Main content.
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="Footer" Runat="Server" >
Footer content.
</asp:content>
[C#]
<% @ Page Language="C#" MasterPageFile="~/Master.master" Title="Content Page 1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="Main" Runat="Server">
Main content.
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="Footer" Runat="Server" >
Footer content.
</asp:content>
@ Page ディレクティブは、コンテンツ ページを特定のマスタ ページにバインドし、マスタ ページにマージされるページのタイトルを定義します。コンテンツ ページには、Content コントロールの外側にあるその他のマークアップは含まれません (マスタ ページには、実行時にタイトル設定をマージできるように runat="server" 属性付きの head 要素が含まれる必要があります)。
複数のマスタ ページを作成すると、サイトの部分ごとに異なるレイアウト、およびマスタ ページごとに異なるコンテンツ ページ セットを定義できます。
マスタ ページの利点
マスタ ページには、これまで開発者が既存のコード、テキスト、およびコントロール要素を繰り返しコピーし、フレームセット、共通要素のインクルード ファイル、ASP.NET ユーザー コントロールなどを使用して作成してきた機能が用意されています。マスタ ページには次のような利点があります。
ページの共通機能を集中化できるため、1 か所だけで更新を行うことができます。
一連のコントロールとコードを作成し、その結果を簡単にページ セットに適用できます。たとえば、マスタ ページのコントロールを使用してメニューを作成し、すべてのページに適用できます。
プレースホルダ コントロールの表示方法を制御できるため、最終ページのレイアウトをきめ細かく制御できます。
個々のコンテンツ ページからマスタ ページをカスタマイズできるオブジェクト モデルが用意されています。
マスタ ページの実行時の動作
実行時には、マスタ ページは次のシーケンスで処理されます。
ユーザーはコンテンツ ページの URL を入力することでページを要求します。
ページがフェッチされると、@ Page ディレクティブが読み取られます。ディレクティブがマスタ ページを参照する場合、マスタ ページも同様に読み取られます。これがページの初めての要求であった場合は、両方のページがコンパイルされます。
コンテンツが更新されているマスタ ページは、コンテンツ ページのコントロール ツリーにマージされます。
個々のContent コントロールのコンテンツは、マスタ ページ内の対応する ContentPlaceHolder コントロールにマージされます。
結果としてマージされたページが、ブラウザに表示されます。
このプロセスは次のようになります。
実行時のマスタ ページ
ユーザーの観点からは、連結されたマスタ ページとコンテンツ ページは単一の独立したページです。ページの URL はコンテンツ ページの URL です。
プログラミングの観点からは、2 つのページはそれぞれのコントロールの別個のコンテナとして動作します。コンテンツ ページはマスタ ページのコンテナとして動作します。ただし、次のセクションで説明するように、コンテンツ ページのコードからパブリック マスタ ページ メンバを参照できます。
マスタ ページはコンテンツ ページの一部となります。実際には、マスタ ページは、コンテンツ ページの子として、またそのページ内のコンテナとして動作します。これは、ユーザー コントロールの動作とほぼ同じです。ただし、この場合、マスタ ページは、ブラウザに表示されるすべてのサーバー コントロールのコンテナです。マージされたマスタ ページとコンテンツ ページのコントロール ツリーは、たとえば次のようになります。
Page
Master Page
(Master page markup and controls)
ContentPlaceHolder
Content page markup and server controls
(Master page markup and controls)
ContentPlaceHolder
Content page markup and server controls
(Master page markup and controls)
このダイアグラムは簡略化されています。コンテンツ ページが対応する Content コントロールを持たない場合、マスタ ページは、ContentPlaceHolder コントロール内にマークアップとコントロールを持つことになります。
一般に、この構造はページの構築方法やページのプログラム方法には影響しません。ただし、場合によっては、マスタ ページにページ全体のプロパティを設定すると、マスタ ページはページ上のコントロールにとって最も近い親であるため、構造がコンテンツ ページの動作に影響することがあります。たとえば、コンテンツ ページの EnableViewState プロパティを true に設定し、マスタ ページで同じプロパティを false に設定している場合、マスタ ページ上の設定が優先されるため、実際にはビューステートが無効化されます。
マスタ ページとコンテンツ ページのパス
コンテンツ ページが要求されると、そのコンテンツがマスタ ページにマージされ、ページはコンテンツ ページのコンテキスト内で実行されます。たとえば、HttpRequest オブジェクトの CurrentExecutionFilePath プロパティを取得する場合、プロパティがコンテンツ ページ コード内にあるかマスタ ページ コード内にあるかに関係なく、パスはコンテンツ ページの場所を表します。
マスタ ページとコンテンツ ページを同じフォルダに入れる必要はありません。コンテンツ ページの @ Page ディレクティブの MasterPageFile 属性が .master ページに解決する限り、ASP.NET ではコンテンツ ページとマスタ ページが 1 つの表示ページにマージされます。
外部リソースの参照
コンテンツ ページとマスタ ページの両方に外部リソースを参照するコントロールと要素を含めることができます。たとえば、両方がイメージ ファイルを参照するイメージ コントロールを含んだり、他のページを参照するアンカーを含んだりできます。
マージされたコンテンツ ページとマスタ ページのコンテキストは、コンテンツ ページのコンテキストです。これは、アンカー内のリソース、つまりイメージ ファイルやターゲット ページなどの URL を指定する方法に影響することがあります。
サーバー コントロール
マスタ ページのサーバー コントロールでは、外部リソースを参照するプロパティの URL を ASP.NET が動的に変更します。たとえば、マスタ ページに Image コントロールを配置し、その ImageUrl プロパティをマスタ ページを基準とするように設定するとします。実行時に、ASP.NET はコンテンツ ページのコンテキスト内で正しく解決するように URL を変更します。
ASP.NET は URL を次のような場合に変更できます。
URL が ASP.NET サーバー コントロールのプロパティである場合。
プロパティがコントロール内で URL として内部的にマークされている場合 (プロパティは UrlPropertyAttribute 属性でマークされている)。実際には、一般的に外部リソースの参照に使用される ASP.NET サーバー コントロールのプロパティがこのようにマークされます。
他の要素
ASP.NET はサーバー コントロールではない要素の URL は変更できません。たとえば、マスタ ページで img 要素を使用していて、その src 属性を URL に設定している場合、ASP.NET は URL を変更しません。その場合、URL はコンテンツ ページのコンテキスト内で解決され、URL を適切に作成します。
一般に、マスタ ページの要素を操作する場合、サーバー コードを必要としない要素についても、サーバー コントロールを使用することをお勧めします。たとえば、img 要素を使用する代わりに、Image サーバー コントロールを使用してください。その方が ASP.NET は URL を正しく解決できるため、マスタ ページやコンテンツ ページを移動すると生じる可能性のある保守の問題を回避できます。
ASP.NET サーバー コントロールのパス指定の詳細については、「ASP.NET Web サイトのパス」を参照してください。
マスタ ページとテーマ
ASP.NET テーマをマスタ ページに直接適用することはできません。テーマ属性を @ Master ディレクティブに追加すると、その実行時にページにエラーが発生します。
ただし、次の状況では、テーマはマスタ ページに適用されます。
テーマがコンテンツ ページで定義されている場合。マスタ ページはコンテンツ ページのコンテキストで解決されるため、コンテンツ ページのテーマはマスタ ページにも同様に適用されます。
テーマ定義を pages 要素 (ASP.NET 設定スキーマ) 要素に含めることによって、サイト全体がテーマを使用するように設定されている場合。
詳細については、「ASP.NET のテーマとスキンの概要」を参照してください。
マスタ ページのスコープの設定
コンテンツ ページは次の 3 つのレベルでマスタ ページに結合できます。
ページ レベル 次のコード例のように、各コンテンツ ページのページ ディレクティブを使用してコンテンツ ページをマスタ ページにバインドできます。
<%@ Page Language="VB" MasterPageFile="MySite.Master" %>
<%@ Page Language="C#" MasterPageFile="MySite.Master" %>
アプリケーション レベル アプリケーションの構成ファイル (Web.config) の pages 要素で設定を行うことによって、アプリケーション内のすべての ASP.NET ページ (.aspx ファイル) が自動的にマスタ ページにバインドされるように指定できます。この要素は次のようになります。
<pages masterPageFile="MySite.Master" />
この方法では、アプリケーション内の Content コントロールを持つすべての ASP.NET ページが指定されたマスタ ページでマージされます (ASP.NET ページが Content コントロールを含まない場合、マスタ ページは適用されません)。
フォルダ レベル この方法は、1 つのフォルダだけで Web.config ファイルの設定を行うという点を除いては、アプリケーション レベルでのバインディングに似ています。マスタ ページのバインディングは、そのフォルダ内の ASP.NET ページに適用されます。
参照
処理手順
方法 : ASP.NET マスター ページのコンテンツを参照する
方法 : ASP.NET マスター ページのコンテンツを参照する