Compartir a través de


Trabajar con las páginas principales ASP.NET mediante programación

Actualización: noviembre 2007

Puede realizar varias tareas habituales en las páginas principales mediante programación, entre éstas se incluyen:

  • Obtener acceso a miembros definidos en la página principal, que pueden ser propiedades y métodos públicos o controles.

  • Adjuntar dinámicamente páginas principales a una página de contenido.

Obtener acceso a miembros de la página principal

Para tener acceso a los miembros de la página principal, la clase Page expone una propiedad Master. Para obtener acceso a los miembros de una página principal concreta desde una página de contenido, puede establecer una referencia con establecimiento inflexible de tipos a la página principal mediante la creación de una directiva @ MasterType. La directiva le permite elegir una página principal concreta. Cuando la página crea su propiedad Master, la propiedad se escribe en la página principal a la que se hace referencia.

Por ejemplo, podría tener una página principal denominada MasterPage.master, que es el nombre de la clase MasterPage_master. Podría crear directivas @ Page y @ MasterType con el siguiente aspecto:

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

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

Cuando utiliza una directiva @ MasterType, como la del ejemplo, puede hacer referencia a los miembros de la página principal como se muestra a continuación:

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

La propiedad Master de la página ya está escrita en MasterPage_master.

Obtener los valores de los controles de la página principal

En tiempo de ejecución, la página principal se combina con la página de contenido; por tanto, el código de esta página puede tener acceso a los controles de la página principal. (Si la página principal tiene controles en un control ContentPlaceHolder, no se tendrá acceso a ellos si se reemplazan por un control Content de la página de contenido.) No se puede obtener acceso directamente a los controles como miembros de la página principal porque están protegidos. Sin embargo, puede utilizar el método FindControl para buscar controles específicos de la página principal. Si el control al que desea obtener acceso está dentro de un control ContentPlaceHolder de la página principal, debe obtener primero una referencia a dicho control y, a continuación, llamar a su método FindControl para obtener una referencia al control.

En el ejemplo siguiente se muestra cómo puede obtener una referencia a los controles de la página principal. Uno de los controles a los que se hace referencia está en un control ContentPlaceHolder, mientras que el otro no lo está.

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

Puede tener acceso al contenido de los controles ContentPlaceHolder de la página principal mediante el método FindControl, como se mostró anteriormente. Si el control ContentPlaceHolder se ha combinado con el contenido de un control Content, el control ContentPlaceHolder no tendrá su contenido predeterminado. En su lugar, contendrá el texto y los controles definidos en la página de contenido.

Adjuntar las páginas principales dinámicamente

Además de especificar una página principal de forma declarativa (en la directiva @ Page o en el archivo de configuración), puede asociar dinámicamente una página principal a una de contenido. Puesto que las páginas principal y de contenido se combinan durante la fase de inicialización del procesamiento de páginas, se debe asignar antes una página principal. Normalmente, debe asignar una página principal dinámicamente durante la fase PreInit, como en el ejemplo siguiente:

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

Establecimiento inflexible de tipos en las páginas principales dinámicas

Si la página de contenido asigna un tipo inflexible a la principal mediante una directiva @ MasterType, el tipo se debe aplicar a cualquier página principal que se asigne dinámicamente. Si pretende seleccionar una página principal dinámicamente, se recomienda que cree una clase base de la que se deriven las páginas principales. La clase de página principal base puede definir las propiedades y los métodos que las páginas principales tienen en común. En la página de contenido, cuando asigna un tipo inflexible a la principal mediante una directiva @ MasterType, puede asignarlo a la clase base en lugar de a una página principal individual.

En los ejemplos siguientes se muestra la creación de un tipo de página principal base que se puede utilizar en varias páginas principales. Los ejemplos incluyen un tipo base que se deriva del control MasterPage, dos páginas principales que se heredan del tipo base y una página de contenido que permite a los usuarios seleccionar una página principal dinámicamente mediante una cadena de consulta (?color=green). El tipo principal base define una propiedad denominada MyTitle. Una de las páginas principales reemplaza la propiedad MyTitle, mientras que la otra no lo hace. La página de contenido muestra dicha propiedad como título de la página. El título de la página variará, por tanto, dependiendo de la página principal seleccionada.

Éste es el tipo de página principal base.

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

Ésta es la primera página principal, que tiene fondo azul. Observe que el atributo Inherits de la directiva @ Master hace referencia al tipo base.

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

Ésta es la segunda página principal. Es igual que la primera, salvo que tiene fondo verde, y reemplaza la propiedad MyTitle definida en el 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>

Ésta es la página de contenido, que permite a los usuarios seleccionar una página principal en función de una cadena de consulta proporcionada con la solicitud. La directiva @ MasterType, que asigna un tipo inflexible a la propiedad Master de la página, hace referencia al tipo base.

<%@ Page Language="VB" Title="Content Page" %>
<%@ 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" %>
<%@ 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>

Vea también

Conceptos

Información general sobre las páginas principales ASP.NET