チュートリアル : Visual Web Developer での ASP.NET マスタ ページの作成と使用
更新 : 2007 年 11 月
このチュートリアルでは、マスタ ページおよび複数のコンテンツ ページを作成する方法について説明します。マスタ ページを使用すると、ページ レイアウト (テンプレート ページ) を作成し、実行時にマスタ ページとマージされるコンテンツを含む個別のページを作成できます。マスタ ページの詳細については、「ASP.NET マスター ページの概要」を参照してください。
このチュートリアルでは、以下のタスクを行います。
マスタ ページの作成
マスタ ページに表示するコンテンツを使用した ASP.NET ページ
さまざまなコンテンツを表示するためのマスタ ページの実行
実行時のマスタ ページの選択
前提条件
このチュートリアルを実行するための要件は次のとおりです。
Visual Studio または Microsoft Visual Web Developer Express Edition。
オプションで、マスタ ページのロゴとして使用できる .jpg、.gif、またはその他のグラフィックス ファイル。ロゴの幅は、48 ピクセル以内にすることをお勧めします。ただし、ロゴの表示はオプションであり、グラフィックの正確なサイズはチュートリアルでは重要ではありません。
Web サイトの作成
「チュートリアル : Visual Web Developer での基本的な Web ページの作成」の手順などを実行して Visual Web Developer で Web サイトを作成済みの場合は、その Web サイトを使用し、次のセクション「マスタ ページの作成」に進むことができます。それ以外の場合は、次の手順に従って、新しい Web サイトおよびページを作成します。
ファイル システム Web サイトを作成するには
Visual Web Developer を開きます。
[ファイル] メニューの [新しい Web サイト] をクリックします。
[新しい Web サイト] ダイアログ ボックスが表示されます。
[Visual Studio にインストールされたテンプレート] の [ASP.NET Web サイト] をクリックします。
[場所] ボックスに、Web サイトのページを格納するフォルダの名前を入力します。
たとえば、フォルダ名として「C:\WebSites」と入力します。
[言語] ボックスで、作業に使用する言語をクリックします。
[OK] をクリックします。
Visual Web Developer によりフォルダが作成され、Default.aspx という名前の新しいページが作成されます。
マスタ ページの作成
マスタ ページは、ページの外観を表すテンプレートです。ここでは、まずマスタ ページを作成します。次に、テーブルを使用して、サイトの各ページに表示されるメニュー、ロゴ、およびフッターをマスタ ページに配置します。また、コンテンツ プレースホルダも使用します。これは、コンテンツ ページの情報に置換できるマスタ ページ内の領域です。
マスタ ページを作成するには
ソリューション エクスプローラで、Web サイトの名前を右クリックし、[新しい項目の追加] をクリックします。
[Visual Studio にインストールされたテンプレート] の [マスタ ページ] をクリックします。
[名前] ボックスに「Master1」と入力します。
[別のファイルにコードを書き込む] チェック ボックスをオンにします。
メモ : このチュートリアルでは、すべてのページに分離コード ファイルを使用していることを前提としています。単一ファイル ASP.NET ページを使用している場合、このチュートリアルに示すコードは機能しますが、個別のコード ファイルではなくソース ビューに表示されます。
[言語] ボックスで、作業に使用するプログラミング言語をクリックし、[追加] をクリックします。
新しいマスタ ページがソース ビューに表示されます。
ページの上部には、通常は ASP.NET ページの上部にある @ Page 宣言の代わりに、@ Master 宣言が表示されます。ページの本文には、ContentPlaceHolder コントロールが含まれます。これは、実行時にコンテンツ ページから置換可能なコンテンツがマージされるマスタ ページの領域です。このコンテンツ プレースホルダの操作方法は、後でこのチュートリアルで説明します。
マスタ ページの配置
マスタ ページでは、サイト内でのページの外観が定義されます。マスタ ページには、静的テキストとコントロールの任意の組み合わせを含めることができます。マスタ ページには、ページを表示したときに動的コンテンツが表示される場所を指定する 1 つ以上のコンテンツ プレースホルダを含めることもできます。
このチュートリアルでは、テーブルを使用してページに要素を配置します。まず、マスタ ページ要素を保持するレイアウト テーブルを作成します。このセクションの後半では、ページに既に配置されているコンテンツ プレースホルダ コントロールを配置します。
マスタ ページのレイアウト テーブルを作成するには
ソース ビューで Master1.master ファイルを選択し、検証用のターゲット スキーマを Microsoft Internet Explorer 6.0 に設定します。この値を設定するには、ツール バーのドロップダウン リストを使用するか、[ツール] メニューの [オプション] をポイントし、[検証] をクリックします。
デザイン ビューに切り替えます。
[プロパティ] ウィンドウの上部にあるドロップダウン リストの [DOCUMENT] をクリックし、BgColor を青などの目立つ色に設定します。
選択する色は重要ではありません。このチュートリアルの後半では、ここで選択した内容と対比するために、色のない 2 番目のマスタ ページを作成します。
レイアウト テーブルを配置するページをクリックします。
メモ : レイアウト テーブルを ContentPlaceHolder コントロール内に配置しないでください。
[テーブル] メニューの [テーブルの挿入] をクリックします。
[表の挿入] ダイアログ ボックスで、3 行 1 列のテーブルを作成し、[OK] をクリックします。
テーブルの 2 行目の中にカーソルを置きます。
[テーブル] メニューの [変更] サブメニューで、[セルの分割] をクリックします。
[セルの分割] ダイアログ ボックスで、[列に分割] を選択し、[OK] をクリックします。
次の設定を行います。
中央の行で左端の列をクリックし、[プロパティ] ウィンドウで Width を 48 に設定します。
上の行をクリックし、[プロパティ] ウィンドウで Height を 48 に設定します。
下の行をクリックし、[プロパティ] ウィンドウで Height を 48 に設定します。
メモ : テーブル セルの境界線をドラッグするか、セルを選択して [プロパティ] ウィンドウで値を設定することで、幅と高さを設定できます。
テーブル内のすべてのセルを選択し、BgColor を背景色と異なる色に設定します。
テーブルをレイアウトした後、すべてのページに表示されるマスタ ページにコンテンツを追加できます。フッターとして著作権メッセージを追加し、メニューを追加します。ロゴ グラフィックを使用できる場合は、それも追加できます。
マスタ ページに静的コンテンツを追加するには
最下部のセルをクリックし、「Copyright 2007 Contoso Inc.」などのフッター テキストを入力します。
ツールボックス の [ナビゲーション] コントロール グループから、Menu コントロールを最上部のセルにドラッグします。
次の手順に従って、メニューを作成します。
Menu コントロールの Orientation プロパティを Horizontal に設定します。
Menu コントロールのスマート タグをクリックし、[Menu タスク] ダイアログ ボックスの [メニュー項目の編集] をクリックします。
[項目] の [ルート ノードの追加] アイコンを 2 回クリックして、2 つのメニュー項目を追加します。
最初のノードをクリックし、Text を「Home」、href を「Home.aspx」に設定します。
2 番目のノードをクリックし、Text を「About」、href を「About.aspx」に設定します。
[OK] をクリックして [メニュー項目エディタ] ダイアログ ボックスを閉じます。
ロゴとして使用できるグラフィックス ファイルがある場合は、次の手順でマスタ ページに配置します。
これで、コンテンツ プレースホルダを配置して、実行時にマスタ ページにコンテンツが表示される位置を指定できます。
コンテンツ プレースホルダを追加するには
ContentPlaceHolder コントロールを中央の右側のセルにドラッグします。
コントロールの ID プロパティは ContentPlaceholder1 です。この名前はそのままにしておいても、変更してもかまいません。名前を変更した場合は、後で必要になるため、名前をメモしてください。
ページを保存します。
マスタ ページのコンテンツの作成
マスタ ページはコンテンツのテンプレートを提供します。マスタ ページに関連付けられた ASP.NET ページを作成して、マスタ ページのコンテンツを定義します。コンテンツ ページは、マスタ ページとマージされるコンテンツだけを含む ASP.NET ページの専用フォームです。コンテンツ ページで、ユーザーがそのページを要求したときに表示するテキストとコントロールを追加します。
このチュートリアルでは、マスタ ページ用コンテンツを持つ 2 つのページを追加します。最初のページはホーム ページで、2 番目のページはバージョン情報ページです。
ホーム ページを作成するには
ソリューション エクスプローラで、Web サイトの名前を右クリックし、[新しい項目の追加] をクリックします。
[Visual Studio にインストールされたテンプレート] の [Web フォーム] をクリックします。
[名前] ボックスに「Home」と入力します。
[言語] ボックスで、使用するプログラミング言語をクリックします。
[マスタ ページを選択する] チェック ボックスをオンにし、[追加] をクリックします。
[マスタ ページを選択してください] ダイアログ ボックスが表示されます。
Master1.master をクリックし、[OK] をクリックします。
新しい .aspx ファイルが作成されます。次のコード例に示すように、このページには、MasterPageFile 属性を持つ選択されたマスタ ページに現在のページを追加する @ Page ディレクティブが含まれます。
[Visual Basic]
<%@ Page Language="VB" MasterPageFile="~/Master1.master" ... %>
[C#]
<%@ Page Language="C#" MasterPageFile="~/Master1.master" ... %>
このページには、次に使用する Content コントロール要素も含まれます。
コンテンツ ページには、html、body、または form の各要素など、ASP.NET ページを構成する通常の要素はありません。代わりに、マスタ ページで作成したプレースホルダ領域を置換することで、マスタ ページに表示するコンテンツだけを追加します。
ホーム ページにコンテンツを追加するには
デザイン ビューに切り替えます。
マスタ ページの ContentPlaceHolder コントロールは、新しいコンテンツ ページの Content コントロールとして表示されます。レイアウトを確認できるようにマスタ ページ コンテンツの残りも表示されますが、コンテンツ ページの編集中は変更できないため、淡色表示されます。
[プロパティ] ウィンドウのドロップダウン リストの [DOCUMENT] をクリックし、[Title] を「Contoso Home Page」に設定します。
コンテンツがマスタ ページとマージされたときにブラウザに正しいタイトルが表示されるように、各コンテンツ ページのタイトルを個別に設定できます。タイトル情報は、コンテンツ ページの @ Page ディレクティブに格納されます。
マスタ ページの ContentPlaceHolder1 に一致する Content コントロールに「Welcome to the Contoso Web Site」と入力します。
テキストを選択し、ツールボックスの上にある [フォーマットのブロック] ドロップダウン リストから Heading 1 を選択することで、テキストを見出しとして書式指定します。
Enter キーを押して、Content コントロールに新しい空白行を作成し、「Thank you for visiting our site」と入力します。
ここで追加するテキストは、重要ではありません。このページをホーム ページとして認識できるようなテキストを入力します。
ページを保存します。
ホーム ページを作成したのと同じ方法で、バージョン情報ページを作成できます。
バージョン情報ページを作成するには
ホーム ページに使用したのと同じ手順を使用して、About.aspx という名前の新しいコンテンツ ページを追加します。
ホーム ページの場合と同じように、Master1.master ページに新しいページを追加します。
ページのタイトルを「Contoso About Page」に変更します。
コンテンツ領域に「About Contoso」と入力し、テキストを選択して、ツールボックスの上にある [フォーマットのブロック] ドロップダウン リストから Heading 1 を選択することで、テキストを Heading 1 として書式指定します。
Enter キーを押して新しい行を作成し、「Since 1982, Contoso has provided high-quality software services」と入力します。
ページを保存します。
ページのテスト
ASP.NET ページの場合と同じように、ページを実行してテストできます。
ページをテストするには
Home.aspx ページに切り替えて、Ctrl キーを押しながら F5 キーを押します。
ASP.NET により、Master1.master ページのレイアウトを使用した Home.aspx ページのコンテンツが単一ページにマージされ、結果のページがブラウザに表示されます。ページの URL は Home.aspx です。ブラウザには、マスタ ページへの参照はありません。
[バージョン情報] リンクをクリックします。
About.aspx ページが表示されます。Master1.master ページともマージされます。
マスタ ページ メンバの参照
コンテンツ ページのコードでは、パブリック プロパティまたはマスタ ページのメソッドとコントロールを含む、マスタ ページのメンバを参照できます。このチュートリアルでは、マスタ ページでプロパティを作成して、コンテンツ ページでそのプロパティ値を使用します。ここでは、Web サイトの会社名がプロパティとしてマスタ ページに格納され、コンテンツ ページの会社名への参照は、マスタ ページ プロパティに基づいていることを前提とします。
最初にマスタ ページにプロパティを追加します。
マスタ ページにプロパティを追加するには
Master1.master ページに切り替えるか、このページを開きます。
ソリューション エクスプローラで、[Master1.master] を右クリックし、[コードの表示] をクリックしてコード エディタを開きます。
メモ : 既定では、Visual Web Developer では分離コード モデルを使用するページが作成されます。必要に応じて、単一ファイル モデルを使用してコードを作成できます。詳細については、「ASP.NET Web ページのコード モデル」を参照してください。
クラス定義内に次のコードを入力します。
Public Property CompanyName() As String Get Return CType(ViewState("companyName"), String) End Get Set(ByVal Value As String) ViewState("companyName") = Value End Set End Property
public String CompanyName { get { return (String) ViewState["companyName"]; } set { ViewState["companyName"] = value; } }
コードにより、マスタ ページの CompanyName という名前のプロパティが作成されます。ポストバック間で永続化されるように、値はビューステートに格納されます。
クラス定義内 (ただし、プロパティ コード内を除く) に次のコードを追加します。
Sub Page_Init(ByVal sender As Object, ByVal e As EventArgs) _ Handles Me.Init Me.CompanyName = "Contoso" End Sub
void Page_Init(Object sender, EventArgs e) { this.CompanyName = "Contoso"; }
この例では、CompanyName プロパティの値をページにハードコーディングします。
ここで、マスタ ページの CompanyName プロパティを使用するようにコンテンツ ページを変更できます。
コンテンツ ページで CompanyName プロパティを参照するには
Home.aspx ページに切り替えるか、このページを開きます。
ソース ビューに切り替えます。
ページの上部で、@ Page ディレクティブの下に次の @ MasterType ディレクティブを追加します。
<%@ MasterType virtualpath="~/Master1.master" %>
ディレクティブによってコンテンツ ページの Master プロパティが Master1.master ページにバインドされます。このプロパティは、すぐに使用します。
デザイン ビューに切り替えます。
Content コントロールで、テキストを「Welcome to the Web site of」に変更します。
ツールボックスの [標準] グループから、Label コントロールを Content コントロールにドラッグし、テキストが次のようになるように、静的テキストの後に配置します。
Welcome to the Web site of [Label]
ソリューション エクスプローラで、[Home.aspx] を右クリックし、[コードの表示] をクリックしてコード エディタを開きます。
クラス定義内に次のコードを追加します。
Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) _ Handles Me.Load CompanyName.Text = Master.CompanyName End Sub
void Page_Load(Object sender, EventArgs e) { CompanyName.Text = Master.CompanyName; }
コンテンツ ページの Master プロパティは、手順 3. で追加した @ MasterType ディレクティブに定義されているように、マスタ ページへの参照を返します。
ここでコンテンツ ページをテストして、マスタ ページの CompanyName プロパティを正しく参照しているかどうかを確認できます。
マスタ ページ プロパティへの参照をテストするには
Home.aspx ページに切り替えるか、このページを開き、Ctrl キーを押しながら F5 キーを押して、ページを実行します。
ページがブラウザに表示され、テキスト [Welcome to the Web site of Contoso] が表示されます。
ブラウザを閉じます。
Master1.master 分離コード ページに切り替えるか、このページを開きます。
次のコード例に示すように、別の会社名がプロパティに割り当てられるように、Page_Init ハンドラを変更します。
Sub Page_Init(ByVal sender As Object, ByVal e As EventArgs) _ Handles Me.Init Me.CompanyName = "New Company Name" End Sub
void Page_Init(Object sender, EventArgs e) { this.CompanyName = "New Company Name"; }
Home.aspx ページに切り替え、Ctrl キーを押しながら F5 キーを押してページを再実行します。
今度は、更新された会社名がページに表示されます。
マスタ ページの動的な変更
状況により、マスタ ページを動的に変更する、つまり、コードを使用して、コンテンツ ページのマスタ ページを設定できるようにする必要があります。たとえば、ユーザーが複数のレイアウトから選択し、設定に応じてマスタ ページを設定できるようにする必要があります。
このチュートリアルでは、Web サイトに 2 番目のマスタ ページを追加し、ユーザーが 2 つのマスタ ページ間を切り替えることができるボタンを作成します。2 つのマスタ ページは非常に似ているため、最初のマスタ ページをコピーして、2 番目のマスタ ページとして機能するように変更します。
マスタ ページをコピーするには
ソリューション エクスプローラで、[Master1.master] を右クリックし、[コピー] をクリックします。
Web サイトの名前を右クリックし、[貼り付け] をクリックします。
Copy of master1.master という名前のマスタ ページが Web サイトに追加されます。
Copy of master1.master を右クリックし、[名前の変更] をクリックして、新しいマスタ ページに Master2.master という名前を付けます。
Master2.master を開き、@ Master ディレクティブで Master1 を Master2 に変更します。
完成したページ ディレクティブは、次のコード例のようになります。
<%@ Master Language="VB" CodeFile="Master2.master.vb" Inherits="Master2" %>
<%@ Master Language="C#" CodeFile="Master2.master.cs" Inherits="Master2" %>
デザイン ビューに切り替えます。
[プロパティ] ウィンドウの上部にあるドロップダウン リストの [DOCUMENT] をクリックします。
BgColor プロパティを削除します。
新しいマスタ ページは Master1.master のように表示され機能しますが、背景色はありません。
Master2.master のコード ファイルを開き、ページの @ Master ディレクティブで Inherits 属性の値が一致するように、マスタ ページの分離コード ファイルのクラス名を Master1 から Master2 へ変更します。
コードは、次の例のようになります。
Partial Class Master2
public partial class Master2 : System.Web.UI.MasterPage
次の手順では、ユーザーが代替マスタ ページを選択できるボタンを各マスタ ページに追加します。
代替マスタ ページを選択するためのボタンを追加するには
Master2.master ページに切り替えるか、このページを開きます。
ツールボックスの [標準] ノードから、LinkButton コントロールをページにドラッグし、上部のテーブル セルのメニューの下に配置します。
ボタンの Text プロパティを「Colorful」に設定します。
ボタンをダブルクリックして Click イベントのハンドラを作成し、次の強調表示されたコードを追加します。
Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As EventArgs)_ Handles LinkButton1.Click Session("masterpage") = "Master1.master" Response.Redirect(Request.Url.ToString()) End Sub
[C#]
void LinkButton1_Click(Object sender, EventArgs e) { Session["masterpage"] = "Master1.master"; Response.Redirect(Request.Url.ToString()); }
コードにより代替マスタ ページのファイル名が永続的なセッション変数に読み込まれ、現在のページが再読み込みされます (Url プロパティは、現在のページを参照する Uri オブジェクトを返します)。次に、マスタ ページの名前を使用するコードをコンテンツ ページで作成します。
Master1.master ページに切り替えるか、このページをデザイン ビューで開きます。
手順 1 および 2 で実行したように、LinkButton コントロールを追加し、Text プロパティを Plain に設定します。
[Plain] をダブルクリックして Click イベントのハンドラを作成し、次の強調表示されたコードを追加します。
Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As EventArgs)_ Handles LinkButton1.Click Session("masterpage") = "Master2.master" Response.Redirect(Request.Url.ToString()) End Sub
void LinkButton1_Click(Object sender, EventArgs e) { Session["masterpage"] = "Master2.master"; Response.Redirect(Request.Url.ToString()); }
このコードは、代替マスタ ページを読み込む点を除いて、Master2.master ページのボタンのコードと同じです。
ここで、ユーザーが選択したマスタ ページを動的に読み込むコードをコンテンツ ページに記述します。
マスタ ページを動的に選択するコードを記述するには
About.aspx ページに切り替えるか、このページを開きます。
メモ : 既に作成したホーム ページには、単一のマスタ ページ (Master1.master) にバインドされる @ MasterType ディレクティブが含まれます。したがって、マスタ ページをホーム ページに動的に割り当てることはできません。代わりに、作成したその他のページを使用します。
ソリューション エクスプローラで、[About.aspx] を右クリックし、[コードの表示] をクリックしてコード エディタを開きます。
クラス定義内に次のコードを追加します。
Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs) _ Handles Me.PreInit If Not Session("masterpage") Is Nothing Then Me.MasterPageFile = CType(Session("masterpage"), String) End If End Sub
void Page_PreInit(Object sender, EventArgs e) { if(Session["masterpage"] != null) { this.MasterPageFile = (String) Session["masterpage"]; } }
コードにより、現在のページの MasterPageFile プロパティの値がセッション変数 (ある場合) 内の値に設定されます。このコードは、Page_PreInit ハンドラで実行する必要があります。Page_PreInit ハンドラよりも後に発生するハンドラ (Page_Init ハンドラなど) で実行することはできません。これは、さらに初期化が行われる前にページのインスタンスが作成されるように、マスタ ページが設定されているためです。
ここで動的なマスタ ページをテストできます。
動的なマスタ ページをテストするには
About.aspx ページで、Ctrl キーを押しながら F5 キーを押して、ページを実行します。
既定のマスタ ページ (Master1.master) とマージされたページがブラウザに表示されます。
[Plain] リンクをクリックします。
今度は Master2.master とマージされて、ページが再表示されます。背景色はありません。
[カラフル] リンクをクリックします。
再度 Master1.master を使用してページが表示されます。
マスタ ページの使用に関する注意事項
マスタ ページを使用する場合、注意が必要な問題点は他にもあります。
実際のアプリケーションでは、会社名などの情報を構成ファイルに保存して、コンテンツ ページで直接読み込む可能性があります。ただし、ここで説明するシナリオでは、コンテンツ ページでマスタ ページ メンバを参照する方法を単純な図で示します。
@ MasterType ディレクティブを含めなくてもマスタ ページのメンバにアクセスできます。ただし、その場合は、Page.Master プロパティを適切なマスタ ページ タイプにキャストする必要があります (ページにマスタ ページがない場合、Master プロパティは null になります)。詳細については、「プログラムによる ASP.NET マスター ページの操作」を参照してください。
Master.FindControls メソッドを使用して、マスタ ページのコントロールを参照できます。詳細については、「プログラムによる ASP.NET マスター ページの操作」を参照してください。
動的なマスタ ページを使用する場合、注意が必要な問題点は他にもあります。
マスタ ページを変更するためのこのセクションのシナリオは、チュートリアルでマスタ ページを中心に説明するために簡略化されています。実際のアプリケーションでは、レイアウトの選択肢を表示し、プロファイルを使用してユーザーの設定を保存する場合がほとんどです。詳細については、「ASP.NET プロファイル プロパティの概要」を参照してください。
すべてのページが同じマスタ ページを使用するように Web サイトを設定できます。いくつかのページでは、代替マスタ ページを使用する必要があります。これは、チュートリアルのこのセクションで説明したような方法で、コードで設定できます。詳細については、「ASP.NET マスター ページの概要」の「マスタ ページのスコープの設定」を参照してください。
既定のマスタ ページをオーバーライドするすべてのページに、Home.aspx ページからコードを追加する必要があります。
次の手順
このチュートリアルでは、マスタ ページの基本機能を説明しています。マスタ ページの追加機能を試すことができます。たとえば、次の場合です。
複数のコンテンツ プレースホルダを含むマスタ ページを作成します。表示するページごとに、1 つ以上のプレースホルダにコンテンツを読み込むことができます。
既定のコンテンツを使用してコンテンツ プレースホルダを定義します。ASP.NET ページがプレースホルダのコンテンツを提供していない場合、マスタ ページには既定のコンテンツが表示されます。
コンテンツ ページからマスタ ページのメンバにプログラムによってアクセスします。これにより、実行時にマスタ ページの外観を動的に変更できます。詳細については、「方法 : ASP.NET マスター ページのコンテンツを参照する」を参照してください。
マスタ ページでデバイス フィルタを使用して、ブラウザ用のレイアウト、特定の種類の電話のレイアウトなど、デバイスごとに異なるレイアウトを作成します。詳細については、「ASP.NET デバイスのフィルタ処理の概要」を参照してください。
マスタ ページ内にマスタ ページを配置して、コンポーネント化されたページを作成する方法を習得します。詳細については、「入れ子にされた ASP.NET マスタ ページ」を参照してください。