Programmgesteuertes Verwenden von ASP.NET-Masterseiten

Aktualisiert: November 2007

Sie können häufig anfallende Aufgaben programmgesteuert mit Masterseiten ausführen, z. B.:

  • Zugreifen auf Member, die auf der Masterseite definiert sind (öffentliche Eigenschaften und Methoden oder Steuerelemente)

  • Dynamisches Anfügen von Masterseiten an eine Inhaltsseite

Zugreifen auf Member auf der Masterseite

Für den Zugriff auf die Member der Masterseite legt die Page-Klasse eine Master-Eigenschaft offen. Um von einer Inhaltsseite aus auf die Member einer bestimmten Masterseite zuzugreifen, können Sie einen stark typisierten Verweis auf die Masterseite erstellen. Erstellen Sie dazu eine @ MasterType-Direktive. Mit der Direktive können Sie auf eine bestimmte Masterseite zeigen. Beim Anlegen der Master-Eigenschaft wird die Eigenschaft auf die Masterseite typisiert, auf die verwiesen wird.

Gehen wir beispielsweise von einer Masterseite mit dem Namen MasterPage.master aus, die dem Klassennamen MasterPage_master entspricht. Sie können auf folgende Weise eine @ Page-Direktive und eine @ MasterType-Direktive erstellen:

<%@ Page  masterPageFile="~/MasterPage.master"%>

<%@ MasterType  virtualPath="~/MasterPage.master"%>

Wenn Sie, wie im Beispiel, eine @ MasterType-Direktive verwenden, können Sie folgendermaßen auf Member der Masterseite verweisen:

CompanyName.Text = Master.CompanyName
CompanyName.Text = Master.CompanyName;

Die Master-Eigenschaft der Seite ist bereits auf MasterPage_master typisiert.

Abrufen der Werte von Steuerelementen auf der Masterseite

Masterseite und Inhaltsseite werden zur Laufzeit zusammengeführt, sodass mit dem Code der Inhaltsseite auf die Steuerelemente der Masterseite zugegriffen werden kann. (Wenn die Masterseite Steuerelemente enthält, die sich in einem ContentPlaceHolder-Steuerelement befinden, kann auf diese Steuerelemente nicht zugegriffen werden, wenn sie von der Inhaltsseite aus durch ein Content-Steuerelement überschrieben wurden.) Auf die Steuerelemente kann nicht direkt als Member der Masterseite zugegriffen werden, da sie geschützt sind. Sie können jedoch die FindControl-Methode verwenden, um bestimmte Steuerelemente auf der Masterseite aufzufinden. Wenn sich das Steuerelement, auf das Sie zugreifen möchten, innerhalb eines ContentPlaceHolder-Steuerelements auf der Masterseite befindet, müssen Sie zuerst einen Verweis auf das ContentPlaceHolder-Steuerelement abrufen. Rufen Sie dann dessen FindControl-Methode auf, um einen Verweis auf das Steuerelement abzurufen.

Das folgende Beispiel zeigt, wie Sie einen Verweis auf Steuerelemente der Masterseite abrufen können. Eines der beiden Steuerelemente, auf die verwiesen wird, befindet sich in einem ContentPlaceHolder-Steuerelement, das andere nicht.

' 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;
}

Sie können auf die Inhalte der ContentPlaceHolder-Steuerelemente der Masterseite zugreifen, indem Sie die FindControl-Methode verwenden (siehe obiges Beispiel). Wenn das ContentPlaceHolder-Steuerelement mit dem Inhalt eines Content-Steuerelements zusammengeführt wurde, enthält das ContentPlaceHolder-Steuerelement nicht den Standardinhalt. Stattdessen enthält es den Text und die Steuerelemente, die auf der Inhaltsseite definiert sind.

Dynamisches Anfügen von Masterseiten

Zusätzlich zur deklarativen Angabe der Masterseite (in der @ Page-Direktive oder in der Konfigurationsdatei) haben Sie die Möglichkeit, eine Masterseite dynamisch an eine Inhaltsseite anzufügen. Da Masterseite und Inhaltsseite in der Initialisierungsphase der Seitenverarbeitung zusammengeführt werden, muss eine Masterseite vorher zugewiesen werden. Die dynamische Zuweisung einer Masterseite sollten Sie in der Regel in der PreInit-Phase vornehmen, wie im folgenden Beispiel gezeigt wird:

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";
}

Starke Typisierung für dynamische Masterseiten

Wenn der Masterseite von der Inhaltsseite mittels einer @ MasterType-Direktive ein starker Typ zugewiesen wird, muss dieser Typ auf alle dynamisch zugewiesenen Masterseiten angewendet werden. Wenn Sie beabsichtigen, eine Masterseite dynamisch auszuwählen, sollten Sie eine Basisklasse erstellen, von der die Masterseiten abgeleitet werden. Über diese Basisklasse für Masterseiten können Sie dann die Eigenschaften und Methoden definieren, die allen Masterseiten gemeinsam sind. Wenn Sie der Masterseite auf der Inhaltsseite mittels einer @ MasterType-Direktive einen starken Typ zuweisen, können Sie diesen Typ der Basisklasse statt einer einzelnen Masterseite zuweisen.

Das folgende Beispiel veranschaulicht, wie Sie einen Basistyp für Masterseiten erstellen können, der von mehreren Masterseiten verwendet werden kann. Das Beispiel besteht aus einem Basistyp, der sich vom MasterPage-Steuerelement ableitet, zwei Masterseiten, die vom Basistyp erben, und einer Inhaltsseite, über die die Benutzer mittels einer Abfragezeichenfolge dynamisch eine Masterseite auswählen können (?color=green). Der Basistyp für Masterseiten definiert eine Eigenschaft mit dem Namen MyTitle. Eine der Masterseiten überschreibt die MyTitle-Eigenschaft, die andere überschreibt sie nicht. Die Inhaltsseite zeigt die MyTitle-Eigenschaft als Titel der Seite an. Dadurch variiert der Titel der Seite entsprechend der ausgewählten Masterseite.

Dies ist der Basistyp für Masterseiten. Er gehört in das Verzeichnis 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"; }
    }
}

Dies ist die erste Masterseite. Sie zeigt einen blauen Hintergrund an. Beachten Sie, dass in der @ Master-Direktive das Inherits-Attribut auf den Basistyp verweist.

<%@ 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 >
    ' No property here that overrrides the MyTitle property of the base master.
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>No title</title>
</head>
<body>
    <form id="form1" >
    <div style="background-color:LightBlue">
        <asp:contentplaceholder id="ContentPlaceHolder1" 
            >
        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 >
    // No property here that overrrides the MyTitle property of the base master.
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" >
    <title>No title</title>
</head>
<body>
    <form id="form1" >
    <div style="background-color:LightBlue">
        <asp:contentplaceholder id="ContentPlaceHolder1" 
            >
        Content from MasterBlue.
        </asp:contentplaceholder>
    </div>
    </form>
</body>
</html>

Dies ist die zweite Masterseite. Sie unterscheidet sich von der ersten Masterseite lediglich dadurch, dass die Seite einen grünen Hintergrund anzeigt und die MyTitle-Eigenschaft überschreibt, die im Basistyp definiert ist.

<%@ 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 >
    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 >   
    <title>No title</title>
</head>
<body>
    <form id="form1" >
    <div style="background-color:LightGreen">
        <asp:contentplaceholder id="ContentPlaceHolder1" >
            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 >
    public override String MyTitle
    { 
        get { return "MasterGreen Title"; } 
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" >   
    <title>No title</title>
</head>
<body>
    <form id="form1" >
    <div style="background-color:LightGreen">
        <asp:contentplaceholder id="ContentPlaceHolder1" 
            >
            Content from MasterGreen.
        </asp:contentplaceholder>
    </div>
    </form>
</body>
</html>

Dies ist die Inhaltsseite. Über sie können Benutzer mittels einer Abfragenzeichenfolge, die mit der Anforderung bereitgestellt wird, eine Masterseite auswählen. Die @ MasterType-Direktive, die der Master-Eigenschaft der Seite einen starken Typ zuweist, verweist auf den Basistyp.

<%@ Page Language="VB" Title="Content Page" MasterPageFile="~/MasterBlue.master"%>
<%@ MasterType TypeName="BaseMaster" %>
<script >
    
    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 >
    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>

Siehe auch

Konzepte

Übersicht über ASP.NET-Masterseiten