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

Introducción

Generalmente cuando creas una aplicación Web en Asp.Net utilizas la funcionalidad que ofrecen las MasterPage. Pero al utilizarlas siempre surge la necesidad que desde las páginas hijas queramos acceder o modificar algún método y/o objeto de la página padre.

Buscando mucho en Internet esto por defecto no es posible hacerlo, pero al realizar algunas modificaciones sencillas es posible realizarlo.

A continuación realizaremos un ejemplo en donde creamos la una página master que contendrá un TextBox que heredarán todas sus páginas hijas:

Código

Tenemos Una Pagina Maestra con el siguiente código:

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Page.master.cs" Inherits="Page" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>">
<html xmlns="<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>">
<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 él 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 página hija accederemos y modificaremos el control del padre así:

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

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s