Compartilhar via


Trabalhando com Páginas Mestras do ASP.NET por Programação

Você pode realizar um número de tarefas comuns programavelmente com páginas mestras, incluindo o seguinte:

  • Acessando membros que são definidos na página mestra, que podem consistir de propriedades e métodos públicos ou controles.

  • Anexar páginas mestras a um página de conteúdo dinamicamente.

Acessar membros na página mestra

Para fornecer acesso a membros de página mestra, a classe Page expõe uma propriedade Master.To access members of a specific master page from a content page, you can create a strongly typed reference to the master page by creating a @ MasterType directive.A diretiva permite que você aponte para uma página mestra específica.Quando a página cria sua propriedade Master, a propriedade é digitada para a página mestra referenciada.

Por exemplo, você pode ter uma página mestra chamada MasterPage.master a qual é o nome de classe MasterPage_master.You might create @ Page and @ MasterType directives that look like the following:

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

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

When you use a @ MasterType directive, such as the one in the example, you can reference members on the master page as in the following example:

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

A propriedade Master da página já está digitada para MasterPage_master.

Obter os valores dos controles na página mestra

Em tempo de execução, a página mestra é mesclada com a página de conteúdo, de modo que os controles na página mestra são acessíveis ao codigo da página de conteúdo.(Se a página mestra contém controles em um controle ContentPlaceHolder, esses controles não estão acessíveis se substituídos por um controle Content da página de conteúdo.) Os controles não estão diretamente acessíveis como membros de página mestra porque eles são protegidos.No entanto, você pode usar o método FindControl para localizar controles específicos na página mestra.Se o controle que você deseja acessar estiver dentro de um controle ContentPlaceHolder sobre a página mestra, você deve primeiro obter uma referência ao controle ContentPlaceHolder e, em seguida, chamar seu método FindControl para obter uma referência ao controle.

O exemplo a seguir mostra como você pode obter uma referência a controles na página mestra.Um dos controles que está sendo referenciado está em um controle ContentPlaceHolder e o outro não.

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

Você pode acessar o conteúdo dos controles ContentPlaceHolder da página mestra usando o método FindControl, conforme mostrado acima.Se o controle ContentPlaceHolder foi mesclado com conteúdo de um controle Content, o controle ContentPlaceHolder não conterá seu conteúdo padrão.Em vez disso, ela conterá o texto e os controles que são definidos na página de conteúdo.

Anexar Páginas mestras dinamicamente

In addition to specifying a master page declaratively (in the @ Page directive or in the configuration file), you can attach a master page dynamically to a content page.Porque a página mestra e a página de conteúdo são mescladas durante o estágio de inicialização do processamento de página, uma página mestra deve ser atribuída antes.Normalmente, você atribui uma página mestra dinamicamente durante o estágio PreInit, como no exemplo a seguir:

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

Tipagem forte para páginas mestras dinâmicas

If the content page assigns a strong type to the master page by using a @ MasterType directive, the type must apply to any master page that you assign dynamically.Se você pretende selecionar uma página mestra dinamicamente, é recomendável que você crie uma classe base da qual derivam suas páginas mestras.A classe base da página-mestre pode, em seguida, definir as propriedades e métodos que as páginas mestras têm em comum.In the content page, when you assign a strong type to the master page by using a @ MasterType directive, you can assign it to the base class instead of to an individual master page.

Os exemplos a seguir mostram como criar um tipo base de página mestra que pode ser usado por várias páginas mestras.Os exemplos consistem de um tipo base que é derivado do controle MasterPage, duas páginas mestras que herdam do tipo base, e uma página de conteúdo que permite aos usuários selecionar uma página mestra dinamicamente usando uma sequência de caracteres da consulta (?color=green) .O tipo base mestre define uma propriedade chamada MyTitle.Uma das páginas mestras sobrepõe a propriedade MyTitle, e a outra não.A página de conteúdo exibe a propriedade MyTitle como título da página.O título da página irá, portanto, variar dependendo de qual página mestra foi selecionada.

Este é o tipo base de página mestra.Ele pertence ao diretório 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"; }
    }
}

Essa é a primeira página mestra, que exibe um plano de fundo azul.Notice that the Inherits attribute in the @ Master directive references the base type.

<%@ 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>

Este é a segunda página mestra.É o mesmo que a primeira página mestra, exceto pelo fato de que ela exibe um plano de fundo verde, e ela sobrepõe a propriedade MyTitle que está definida no tipo base.

<%@ 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>

Este é a página de conteúdo, que permite aos usuários selecionar uma página mestra com base em uma sequência de caracteres de consulta fornecida com a solicitação.The @ MasterType directive, which assigns a strong type to the page's Master property, references the base type.

<%@ 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>

Consulte também

Conceitos

Visão Geral de Páginas Mestras ASP.NET