如何在ASP.NET 3.5的Web内容页面中设置页面标题

10

我已经阅读了很多有关如何做到这一点的帖子/文章,但我仍然无法从内容页面设置页面标题。我的页面呈现正常,除了我无法从内容页面设置标题(所有页面都按照主页面设置标题)。以下是我的主页面的代码:

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>

然而,正是在网页内容页面中,我想为该页面建立 <title> 标签的价值,并将其放置在我的测试内容页面中:

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在ASP.NET动态设置页面标题教程中所说,这似乎是可行的。具体来说,我尝试按照文章中的步骤进行操作: “此外,如果您使用主页面,此代码可以按原样工作,无论是在主页面还是在使用主页面的ASP.NET页面上。在这种情况下,区域应该在主页面中定义,但是ASP.NET页面仍然可以通过Page.Header访问它。”
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

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

这种方式可以在内容页标题之前设置母版页标题。如果您没有从内容页设置标题,则母版页将成为默认标题。如果您从内容页设置了标题,则它将覆盖母版页标题。


1
谢谢大家。我认为母版页的Page_Load会在内容页的Page_Load之后执行有点不符合直觉,但现在把母版页看作用户控件,这就更有意义了。顺便说一下,我忽略了.aspx文件中Page_Load上的“Handles Me.Load”,当我添加它后,调试器就在那里停在断点上了。非常感谢。 - John Adams

6
问题在于页面中的Page_Load方法在用户控件中的Page_Load方法之前运行,而主控件实际上是一个用户控件。您可以使用主控件中的Page_Init方法代替。

4

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

在内容页的第一行使用<%@ Page Title="你的标题" Language="C#" MasterPageFile="~/_masterpages/...等等


3
你需要记住的是,MasterPage 是 Page 的子控件,因此 OnLoad 事件会在 Page 的 OnLoad 事件之后触发。
在你的情况/示例中,页面将设置标题,然后 MasterPage 在此之后再次设置标题。可以在生命周期的晚些时候设置它或者在谁设置它周围包装一些逻辑。
Scott Allen 在 Master Page 特别方面有一篇很好的文章,快速阅读以了解生命周期顺序

2

我也遇到了这个问题。 由于更改主文件可能会产生太多的副作用,因此我使用了页面的PreRender()方法,在主页面的Page_Load()方法之后触发。

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

0

我有时候使用的另一种解决方案是在母版页的标题标签之间放置一个ContentPlaceholder,然后您可以在内容标记中使用Label控件并将其呈现到那里。

这样,您可以在控件已经回传后为页面设置标题。


0

要将页面标题与默认的主控页标题组合起来,您可以使用默认的ASP.NET Web应用程序模板使用的标准模板。

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

这种方式是从各个页面读取页面标题的。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接