2010-05-19 16 views
5

Todo lo que quiero hacer es acceder al elemento <body> desde el código subyacente de una página de contenido y añadir un nombre de la clase a la misma.Acceso elemento del cuerpo de la página de contenido a través de una página maestra anidada

que tienen una página maestra de nivel superior con el elemento <body> en ella. Luego tengo una página maestra anidada que es la página maestra de la página de contenido. Desde el código detrás de la página de contenido, quiero agregar un nombre de clase al elemento del cuerpo. Eso es todo.

tengo esto en el maestro de nivel superior:

<body id="bodyNode" runat="server"> 

he añadido esto al código subyacente de la página de contenido:

Master.bodyNode.Attributes.add("class", "home-page"); 

Y consigo un mensaje que:

System.Web.UI.MasterPage 'no contiene una definición para' bodyNode

Si agrego esto a la página de contenido aspx:

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

El mensaje cambia a:

bodyNode es inaccesible debido a su nivel de protección

favor avise, He perdido 2 horas en lo que parece ser algo que debería ser realmente simple de hacer :(

Respuesta

11

una vez que haya establecido runat = "server" para el nodo cuerpo, tienes que acceder a él mediante el espacio de nombres HTMLControls. prueba esto.

public void Page_Load(Object sender, EventArgs e) 
{ 
//Inject onload and unload 
HtmlGenericControl body = (HtmlGenericControl)Master.FindControl("bodyNode"); 
body.Attributes.Add("class", "home-page"); 
} 

EDITAR
Su problema es que se han anidado páginas maestras.

Dado que la etiqueta "body" está en su página maestra de nivel superior, Master.FindControl() no funcionará, ya que eso está buscando en la página maestra anidada.

Lo que hay que hacer es usar Master.Master.FindControl(), o de forma recursiva bucle a través de sus páginas maestras, subiendo hasta Master.Master es nula (como entonces usted sabe que está en la página maestra de nivel superior) y luego llamar FindControl() en eso.

+0

También puede configurar una propiedad pública para permitirle acceder al cuerpo sin cortar y pegar este código en todas sus páginas de contenido –

+0

Gracias, agregué esto pero ahora la excepción ha cambiado a: 'Referencia a objeto no establecida como instancia de un objeto.' la línea que genera esto es 'body.Attributes.Add (' class ',' home-page ');' aunque no hay ningún subrayado rojo en el archivo real para indicar un problema ...? – danwellman

+0

esto significa que "cuerpo" es nulo. Verifique que la línea de arriba esté correctamente encontrando poniendo un punto de quiebre después. Probablemente encontrarás que no lo es. Intenta ejecutar Master.FindControl ("bodyNode") en el modo inmediato (una vez que llegas al punto de interrupción) y ve lo que devuelve, voy a probar y volver a responder en breve –

0

Agregaría una propiedad pública al código detrás de la página maestra que permitiría el acceso a la etiqueta corporal que es parte de la página maestra. Y luego llama esa propiedad desde la página de contenido.

+0

Eso suena como que podría funcionar. Sin embargo, no estoy seguro de cómo hacerlo ... – danwellman

Cuestiones relacionadas