9

我已经阅读了很多关于如何执行此操作的帖子/文章,但我仍然没有从内容页面获取页面标题设置。我的页面呈现正常,但我无法从内容页面获取标题集(所有页面都根据母版页设置了标题)。这是我的母版页的代码隐藏:

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

这是母版页的其余部分:

<%@ 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>

然而,我想在网页内容页面中建立页面的值,并将其放置在我的测试内容页面中:

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

奇怪的是,我无法让调试器在内容页面的上面一行停止 - 只能在母版页的相应行上停止。显然,我对此感到困惑。

我读过还有其他方法可以做到这一点,但这似乎可以从我在 Scott Mitchell 的教程中读到的内容:Dynamicly setting the Page Title in ASP.NET。具体来说,我试图从文章中遵循这一点: “此外,如果您正在使用母版页,则此代码可以按照所写的方式从母版页或使用母版页的 ASP.NET 页面工作。在这种情况下, 该区域应该在母版页中定义,但是 ASP.NET 页面仍然可以通过 Page.Header 访问它。”

4

7 回答 7

10

所以需要发生的是

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

默认.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

这样,您的母版页标题就设置在您的内容页标题之前。如果您没有从内容页面设置标题,则母版页将是默认标题。如果您确实从内容页面设置了标题,那么它将覆盖它。

于 2010-02-19T00:58:38.617 回答
6

问题是页面中的Page_Load方法在页面中的用户控件中的Page_Load方法之前运行,而母版页实际上是用户控件。

您可以改用母版页中的 Page_Init 方法。

于 2010-02-19T00:43:24.907 回答
3

您必须记住,MasterPage 是 Page 的子控件,因此该OnLoad事件在Page 的事件之后OnLoad触发。

在您的场景/示例中,页面将设置标题,然后母版页将在之后再次设置它。要么在生命周期的后期进行设置,要么围绕谁设置更多逻辑?

Scott Allen 专门为 Master Page 撰写了一篇很好的文章,请快速阅读以了解生命周期顺序

于 2010-02-19T00:42:23.850 回答
3

母版页中更简单的解决方案 <%: Page.Title %> - 主标题在这里

在内容页面的第一行 <%@ Page Title="Your Title" Language="C#" MasterPageFile="~/_masterpages/... 等

于 2015-09-21T02:02:29.883 回答
2

我也有这个问题。我无法编辑主文件(太多可能的副作用),所以我使用了页面 PreRender() 方法,该方法在主页面 Page_Load()之后触发

protected void Page_PreRender(object sender, EventArgs e)
{
    Page.Title = Page.Title + " - server error 500";
}
于 2014-02-04T00:34:14.967 回答
0

我有时使用的另一个解决方案是在母版页上的标题标签之间放置一个内容占位符,然后您可以在内容标签中使用标签控件并将其呈现。

例如,通过这种方式,您可以在控件回发后给页面一个标题。

于 2010-02-19T01:03:52.267 回答
0

要将页面标题与您的默认 MasterPage标题相结合,您可以使用默认 ASP.NET Web 应用程序模板使用的标准模板。

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

这样这个页面。标题是从单个页面中读取的

<%@ Page Title="Virtual Machines" ...>
于 2016-12-31T12:36:10.383 回答