2010-02-19 19 views
7

He leído un buen número de publicaciones/artículos sobre cómo hacer esto y todavía no obtengo el título de la página del contenido. Mis páginas se procesan correctamente, excepto que no puedo obtener el título establecido de la página de contenido (todas las páginas tienen el título configurado según la página maestra). Aquí está el código subyacente para mi página principal:Cómo establecer el título de la página desde una página de contenido web en ASP.NET 3.5

Partial Class zSEO 
Inherits System.Web.UI.MasterPage 
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
     Page.Header.Title = "Dynamically set in Master page" 
    End Sub 
End Class 

Aquí está el resto de la página maestra:

<%@ Master Language="VB" 
EnableTheming="true" 
Inherits="zSEO" 
CodeFile="zSEO.master.vb" %> 
<!DOCTYPE html 
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
    <head id="Head1" runat="server"> 
     <title></title> 
    </head> 
<body> 
<form id="form1" runat="server">  

<div id="container"> 
    <div id="content"> 
     <asp:contentplaceholder id="ContentPlaceHolder1" runat="server"> 
     </asp:contentplaceholder> 
    </div>  
</div>  
</form> 
</body> 
</html> 

Sin embargo, es en el contenido de la página web que quiero establecer el valor de la de la página y he puesto esto en mi página de contenido de prueba:

Public Partial Class zShowAd 
Inherits System.Web.UI.Page 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
    Page.Header.Title = "Dynamically set TITLE value in the content(child) page" 
End Sub 

End Class 

Curiosamente, no se puede conseguir el depurador se detenga en la línea superior de la página de contenido - sólo en el correspon línea de ding en la página maestra. Claramente, estoy confundido sobre esto.

He leído que hay otras maneras de hacerlo, pero esto parecía ser posible por lo que leí en el tutorial de Scott Mitchell en: Dynamically setting the Page Title in ASP.NET. Específicamente, traté de seguir esto desde el artículo: "Además, si está utilizando páginas maestras, este código puede funcionar, tal como está escrito, desde la página maestra o la página ASP.NET que utiliza la página maestra. un escenario, la región debe definirse en la página maestra, pero la página ASP.NET puede acceder a ella a través de Page.Header. "

Respuesta

10

Entonces, ¿qué tiene que ocurrir es este

MasterPage.Master

Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init 
    Me.Page.Title = "Dynamically set in Master page" 
End Sub 

Default.aspx

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    Me.Page.Title = "Dynamically set in ASPX page" 
End Sub 

De esta manera el título de la página principal está puesto delante de su contenido Título de la página. Si no establece un título desde la página de contenido, la página maestra será el título predeterminado. Si establece un título desde la página de contenido, lo sobrescribirá.

+1

Gracias chicos. Creo que es un poco contrario a la intuición que el Page_Load de la página maestra vendría DESPUÉS de la carga de página de la página de contenido, pero ahora pensar en la página maestra como un control de usuario tiene más sentido. Por cierto, he descuidado el "Handles Me.Load" en el Page_Load en el archivo .aspx y tan pronto como lo agregué, el depurador se detuvo allí en un punto de interrupción. Muchas gracias. –

3

Debe recordar que MasterPage es un control secundario de la página, por lo tanto el evento OnLoad desencadena después de el evento OnLoad de la página.

En su escenario/ejemplo, la página establecería el título, luego la página maestra lo establecería nuevamente después. ¿Lo configura más adelante en el ciclo de vida o le da más lógica a quién lo configura quizás?

Scott Allen tiene un buen artículo sobre esto específicamente para Master Page, give it a quick read to get a feel for the lifecycle order.

6

El problema es que el método Page_Load en la página se ejecuta antes del método Page_Load en los controles de usuario en la página, y una página maestra es realmente un control de usuario.

En su lugar, puede utilizar el método Page_Init en la página maestra.

0

Otra solución que he usado a veces es colocar un marcador de contenido entre las etiquetas de título en la página maestra, luego puedes usar un control de etiqueta en la etiqueta de contenido y renderizarlo para eso.

De esta manera puede darle a la página un título después de que los controles se hayan publicado, por ejemplo.

2

Estaba teniendo este problema también. No puedo editar el archivo maestro (demasiados efectos secundarios posibles), por lo que se utiliza el método de páginas PreRender(), que dispara después de las páginas maestras Load()

protected void Page_PreRender(object sender, EventArgs e) 
{ 
    Page.Title = Page.Title + " - server error 500"; 
} 
2

solución más sencilla en Master página <%: Page.Title%> - el título principal va aquí

en la página de contenido de primera línea que <% @ Page título = "Su título" Language = "C#" MasterPageFile = "~/_masterpages/.. .etc

0

para combinar Página Título con su página maestra predeterminada Título puede usar la plantilla estándar que usa la plantilla predeterminada de la aplicación web ASP.NET.

<head runat="server"> 
    <title > <%: Page.Title %> | Portal Main site Name </title> 

esta manera esto page.Title se lee de forma páginas individuales

<%@ Page Title="Virtual Machines" ...> 
Cuestiones relacionadas