post icon

Acceder a métodos y objetos del MasterPage en Asp.Net

Es muy común crear aplicaciones en Asp.Net con MasterPage de por medio por las facilidades que nos ofrece.

Es también muy común que desde las páginas hijas querramos acceder o modificar algún método y/o objeto de la página padre. Esto por defecto no es posible hacerlo, pero es sencillo agregar lo necesario para realizarlo.

Veamos un ejemplo demasiado simple que ya pasa por tonto pero sirve para comprender el concepto, creamos la siguiente página master que contendra un TextBox que heredarán todas sus paginas hijas:

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Page.master.cs" Inherits="Page" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Ejercicio para devtroce.com</title>
    <asp:ContentPlaceHolder id="head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
            <asp:TextBox ID="txtDevtroce" runat="server"></asp:TextBox>
        </asp:ContentPlaceHolder>
    </div>
    </form>
</body>
</html>

En esta página maestra vemos que tenemos un textBox será posible agregar texto en el desde el hijo. Para eso necesitamos crear un setter y getter del control en el master:

using System;
using System.Web.UI.WebControls;

public partial class Page : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    public TextBox TxtBox
    {
        get { return txtDevtroce; }
        set { txtDevtroce = value; }
    }
}

Luego debemos agregar en la página hija un bloque de mastertype, así:

<%@ Page Language="C#" MasterPageFile="~/Page.master" AutoEventWireup="true" CodeFile="Hijo.aspx.cs" Inherits="Hijo" Title="Página sin título" %>

<%@ MasterType VirtualPath="~/Page.master" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
</asp:Content>

Finalmente en el load de la pagina hija accederemos y modificaremos el control del padre asi:

using System;

public partial class Hijo : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Master.TxtBox.Text = "funciona?"; // seteamos el valor
        Response.Write(Master.TxtBox.Text); // obtenemos el valor
    }
}
22 diciembre 2010

Comentarios desde Facebook:

  1. avatar
    Arnold COLOMBIA Google Chrome Windows
    13 abril 2013 at 02:55 #

    Hola estoy probando tu codigo y me esta surgiendo un detalle, Resulta que estoy intentando asignar valor a un label que se encuentra en la master despues de autenticarse con el control Login. El problema esta en que cuando coloco usuario y clave erradas me da el valor que yo le asigno, pero cuando le coloco el usuario y la clave correcta, el label no esta tomando el valor que le asigne. Asiendo depuracion veo que la variable Master.Lbl.Text si coge el valor pero no lo muestra en la pagina.
    Que puede ser gracias.

  2. avatar
    gaperga COSTA RICA Google Chrome Windows
    28 marzo 2013 at 15:25 #

    Como seria si lo que ocupara es que se ejecute el evento click de un boton

  3. avatar
    juan GUATEMALA Mozilla Firefox Windows
    31 octubre 2012 at 19:48 #

    justo lo que buscaba, te debo una 😀

Responder