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