プログラムによる ASP.NET マスター ページの操作
更新 : 2007 年 11 月
マスタ ページでは、次のような一般的なタスクをプログラムによって実行できます。
マスタ ページで定義されているメンバへのアクセス。これらのメンバは、パブリック プロパティ、パブリック メソッド、またはコントロールで構成されている可能性があります。
コンテンツ ページへのマスタ ページの動的な結合。
マスタ ページのメンバへのアクセス
マスタ ページのメンバへのアクセスを可能にするために、Page クラスは Master プロパティを公開します。コンテンツ ページから特定のマスタ ページのメンバにアクセスする場合は、@ MasterType ディレクティブを作成して、厳密に型指定された、マスタ ページへの参照を作成できます。このディレクティブにより、特定のマスタ ページを指すことが可能になります。ページの Master プロパティを作成すると、このプロパティは、参照されるマスタ ページに型指定されます。
たとえば、クラス名が MasterPage_master である、MasterPage.master という名前のマスタ ページがあるとします。この場合、次のような @ Page ディレクティブと @ MasterType ディレクティブを作成できます。
<%@ Page masterPageFile="~/MasterPage.master"%>
<%@ MasterType virtualPath="~/MasterPage.master"%>
上の例にあるような @ MasterType ディレクティブを使用すると、次の例に示すようにマスタ ページのメンバを参照できます。
CompanyName.Text = Master.CompanyName
CompanyName.Text = Master.CompanyName;
ページの Master プロパティは、既に MasterPage_master に型指定されています。
マスタ ページのコントロールの値の取得
マスタ ページは、実行時にコンテンツ ページにマージされるため、マスタ ページのコントロールにコンテンツ ページのコードがアクセスできるようになります (マスタ ページの ContentPlaceHolder コントロールにコントロールが含まれている場合、これらのコントロールは、コンテンツ ページの Content コントロールによってオーバーライドされるとアクセスできなくなります)。マスタ ページのコントロールは保護されているため、マスターページ メンバとして直接アクセスできません。ただし、FindControl メソッドを使用すると、マスタ ページの特定のコントロールを検索できます。アクセス対象のコントロールが、マスタ ページの ContentPlaceHolder コントロールの内部に存在する場合は、最初に ContentPlaceHolder コントロールへの参照を取得し、次にその FindControl メソッドを呼び出して、コントロールへの参照を取得する必要があります。
次の例では、マスタ ページのコントロールへの参照を取得する方法を示します。参照対象のコントロールのうち 1 つは ContentPlaceHolder コントロールに含まれていますが、もう 1 つは含まれていません。
' Gets a reference to a TextBox control inside a ContentPlaceHolder
Dim mpContentPlaceHolder As ContentPlaceHolder
Dim mpTextBox As TextBox
mpContentPlaceHolder = _
CType(Master.FindControl("ContentPlaceHolder1"), _
ContentPlaceHolder)
If Not mpContentPlaceHolder Is Nothing Then
mpTextBox = CType(mpContentPlaceHolder.FindControl("TextBox1"), _
TextBox)
If Not mpTextBox Is Nothing Then
mpTextBox.Text = "TextBox found!"
End If
End If
' Gets a reference to a Label control that is not in a
' ContentPlaceHolder control
Dim mpLabel As Label
mpLabel = CType(Master.FindControl("masterPageLabel"), Label)
If Not mpLabel Is Nothing Then
Label1.Text = "Master page label = " + mpLabel.Text
End If
// Gets a reference to a TextBox control inside a ContentPlaceHolder
ContentPlaceHolder mpContentPlaceHolder;
TextBox mpTextBox;
mpContentPlaceHolder =
(ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1");
if(mpContentPlaceHolder != null)
{
mpTextBox = (TextBox) mpContentPlaceHolder.FindControl("TextBox1");
if(mpTextBox != null)
{
mpTextBox.Text = "TextBox found!";
}
}
// Gets a reference to a Label control that is not in a
// ContentPlaceHolder control
Label mpLabel = (Label) Master.FindControl("masterPageLabel");
if(mpLabel != null)
{
Label1.Text = "Master page label = " + mpLabel.Text;
}
マスタ ページの ContentPlaceHolder コントロールのコンテンツにアクセスするには、上記のように FindControl メソッドを使用します。ContentPlaceHolder コントロールが、既に Content コントロールのコンテンツとマージされている場合、ContentPlaceHolder コントロールには、既定のコンテンツは含まれません。代わりに、コンテンツ ページで定義されているテキストとコントロールが含まれます。
マスタ ページの動的な結合
マスタ ページは、@ Page ディレクティブや構成ファイルで宣言的に指定できるだけでなく、コンテンツ ページに動的に結合することもできます。マスタ ページとコンテンツ ページはページ処理の初期段階でマージされるため、マスタ ページは事前に割り当てておく必要があります。通常、マスタ ページは、次の例に示すように PreInit 段階で動的に割り当てます。
Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs) _
Handles Me.PreInit
Me.MasterPageFile = "~/NewMaster.master"
End Sub
void Page_PreInit(Object sender, EventArgs e)
{ this.MasterPageFile = "~/NewMaster.master";
}
動的マスタ ページの厳密な型指定
コンテンツ ページが、@ MasterType ディレクティブを使用して厳密な型をマスタ ページに割り当てる場合は、動的に割り当てるすべてのマスタ ページにその型を適用する必要があります。マスタ ページを動的に選択する場合は、マスタ ページの派生元となる基本クラスを作成することをお勧めします。そのようにすると、基本マスタ ページ クラスで、マスタ ページに共通のプロパティとメソッドを定義できます。コンテンツ ページでは、@ MasterType ディレクティブを使用してマスタ ページに厳密な型を割り当てると、その型を個々のマスタ ページではなく、基本クラスに割り当てることができます。
以下の例では、複数のマスタ ページで使用できる基本マスタ ページ型を作成する方法を示します。これらの例は、MasterPage コントロールから派生する基本型、基本型から継承される 2 つのマスタ ページ、およびユーザーがクエリ文字列 (?color=green) を使用してマスタ ページを動的に選択できるコンテンツ ページで構成されています。基本マスター型は、MyTitle というプロパティを定義します。マスタ ページのうち、1 つは MyTitle プロパティをオーバーライドしますが、もう 1 つはオーバーライドしません。コンテンツ ページには、ページのタイトルとして MyTitle プロパティが表示されます。そのため、ページのタイトルは、どのマスタ ページが選択されたかによって変化します。
次の例は、基本マスタ ページ型です。App_Code ディレクトリに所属しています。
Public Class BaseMaster
Inherits MasterPage
Public Overridable ReadOnly Property MyTitle() As String
Get
Return "BaseMaster Title"
End Get
End Property
End Class
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public class BaseMaster : System.Web.UI.MasterPage
{
public virtual String MyTitle
{
get { return "BaseMaster Title"; }
}
}
次の例は、最初のマスタ ページで、青い背景色を表示します。@ Master ディレクティブの Inherits 属性が基本型を参照することに注意してください。
<%@ Master Language="VB" Inherits="BaseMaster"
ClassName="MasterBlue" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<script runat="server">
' No property here that overrrides the MyTitle property of the base master.
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>No title</title>
</head>
<body>
<form id="form1" runat="server">
<div style="background-color:LightBlue">
<asp:contentplaceholder id="ContentPlaceHolder1"
runat="server">
Content from MasterBlue.
</asp:contentplaceholder>
</div>
</form>
</body>
</html>
<%@ Master Language="C#" Inherits="BaseMaster"
ClassName="MasterBlue" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<script runat="server">
// No property here that overrrides the MyTitle property of the base master.
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>No title</title>
</head>
<body>
<form id="form1" runat="server">
<div style="background-color:LightBlue">
<asp:contentplaceholder id="ContentPlaceHolder1"
runat="server">
Content from MasterBlue.
</asp:contentplaceholder>
</div>
</form>
</body>
</html>
次の例は、2 番目のマスタ ページです。このページは、緑の背景色を表示し、基本型で定義されている MyTitle プロパティをオーバーライドする点を除いて、最初のマスタ ページと同じです。
<%@ Master Language="VB" Inherits="BaseMaster"
ClassName="MasterGreen" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<script runat="server">
Public Overrides ReadOnly Property MyTitle() As String
Get
Return "MasterGreen Title"
End Get
End Property
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>No title</title>
</head>
<body>
<form id="form1" runat="server">
<div style="background-color:LightGreen">
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
Content from MasterGreen.
</asp:contentplaceholder>
</div>
</form>
</body>
</html>
<%@ Master Language="C#" Inherits="BaseMaster"
ClassName="MasterGreen" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<script runat="server">
public override String MyTitle
{
get { return "MasterGreen Title"; }
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>No title</title>
</head>
<body>
<form id="form1" runat="server">
<div style="background-color:LightGreen">
<asp:contentplaceholder id="ContentPlaceHolder1"
runat="server">
Content from MasterGreen.
</asp:contentplaceholder>
</div>
</form>
</body>
</html>
次の例は、コンテンツ ページです。このページでは、要求に添付したクエリ文字列に基づいて、ユーザーがマスタ ページを選択できます。ページの Master プロパティに厳密な型を割り当てる @ MasterType ディレクティブは、基本型を参照します。
<%@ Page Language="VB" Title="Content Page" MasterPageFile="~/MasterBlue.master"%>
<%@ MasterType TypeName="BaseMaster" %>
<script runat="server">
Protected Sub Page_PreInit(ByVal sender As Object,
ByVal e As System.EventArgs)
Me.MasterPageFile = "MasterBlue.master"
If Request.QueryString("color") = "green" Then
Me.MasterPageFile = "MasterGreen.master"
End If
Me.Title = Master.MyTitle
End Sub
</script>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
Content from Content page.
</asp:Content>
<%@ Page Language="C#" Title="Content Page" MasterPageFile="~/MasterBlue.master"%>
<%@ MasterType TypeName="BaseMaster" %>
<script runat="server">
protected void Page_PreInit(Object sender, EventArgs e)
{
this.MasterPageFile = "MasterBlue.master";
if(Request.QueryString["color"] == "green")
{
this.MasterPageFile = "MasterGreen.master";
}
this.Title = Master.MyTitle;
}
</script>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1"
Runat="Server">
Content from Content page.
</asp:Content>