次の方法で共有


プログラムによる 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>

参照

概念

ASP.NET マスター ページの概要