使用ASP.NET MasterPage复制标题标记

时间:2010-01-20 15:07:24

标签: asp.net master-pages title

我需要动态设置页面的标题,因此我使用类似于以下内容的代码:

<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="~/about.aspx.cs" Inherits="Default" %>
<%@ Register Assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" tagprefix="ajaxToolkit" %>
<%@ MasterType VirtualPath="MasterPage.master" %>
<%@ OutputCache Duration="43200" VaryByParam="*" Location="Server" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
 <title><%=pageTitle%></title>
</asp:Content>

但这会生成重复的标题标签。有什么方法可以解决这个问题吗?感谢。

编辑:根据以下建议,我现在在MasterPage中有以下内容:

<head id="Head1" runat="server">
<title>Default Title</title>
...
<asp:ContentPlaceHolder id="head" runat="server">
</asp:ContentPlaceHolder>
</head> 

以及我的主页中的以下内容:

    this.Title="xxx";

但我没有获得任何头衔(既没有“默认标题”也没有“xxx”)。

编辑:没关系。使用该方法使其工作。

8 个答案:

答案 0 :(得分:10)

如果第二个标题标记为空且位于head标记的末尾,那么正在发生的事情是Head控件(注意runat="server")无法在其控件中看到Title控件,因此在末尾添加一个空的Title标签。

这里的大多数答案都是有效的,但是为了实现最小的改变,您可以做的是add the following to your head control -

<title id="Title1" visible="false" runat="server"><%-- hack to turn the auto title off --%></title>

其他选项包括 -

  • 从头控件中取出runat="server",但这意味着您无法使用服务器端控件
  • 使用标题控件并以编程方式设置它,就像您的解决方案一样。

我喜欢隐藏的标题标记,因为它允许您使用ContentPlaceholder方法,该方法将其保留在模板中。它还允许您使用自定义控件来获取标题(在我们的示例中,我们使用第三方库从数据库中提取标题)

See this blog post by Phil Haack for the background on this.

答案 1 :(得分:8)

.master的标题需要如下所示:

<head runat="server">
<title>Default Title</title>
  .. other tags
</head>

然后在Page_Load中的代码隐藏页面中,写下:

protected void Page_Load(object sender, EventArgs e)
{
    this.Title = "My Page Title";
}

答案 2 :(得分:5)

要避免重复标记,只需执行以下操作,无需额外代码。

在您的MasterPage中有这样的内容:

<head>
    <title></title>
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
</head>

在每个其他页面上,将Title =“Your Title”属性添加到页面指令:

<%@ Page Title="Your Title" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

这样可以消除重复的标记,并将标题放在代码视图顶部清晰可见的位置。

希望这有帮助。

答案 3 :(得分:0)

试试这个

        ((MyPageClass)Page).Title = "Your Page Title"

此代码位于主页面的Page_Load中。我必须使用强制转换(“MyPageClass”)因为我派生了自己的PageClass,所以我可以在那里放置强类型的会话对象。如果你不这样做,那么你就不需要演员了。

如果您需要在页面级别执行此操作,我认为您可以使用:

     Title = "Your Page Title"
在你的Page_Load中

答案 4 :(得分:0)

如果在您的母版页中标题部分如下所示:
    <title><%=someTitleVariable%></title>

然后将其用作代码:
    <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> <%=pageTitle%> </asp:Content>

答案 5 :(得分:0)

在定义<asp:Content ContentPlaceHolderID="head">控件时,您不会修改已存在的标题,而是在ID为“head”的Content Place Holder中添加更多标记。在你的母版页中,我想你会有这样的东西:

<head>
  <title>Master Page Title</title>
  <asp:ContentPlaceHolder id="head" runat="Server" />
</head>

因此,<asp:ContentPlaceHolder>会被<asp:Content ContentPlaceHolderID="head">取代,因此您最终会得到第二个<title>元素。

因此,要么从您的母版页中删除<title> - 这意味着您需要所有您的aspx文件中的<title> - 或者使用某些代码来执行类似的操作此...

this.Title = pageTitle;
// if that doesn't do it try
// this.Header.Title = pageTitle;

答案 6 :(得分:0)

大约2年后,这个问题仍然存在。打网站的SEO。

使用MVC 4.5RC。您需要做的就是在主内容区域之前放置一个空标签。无需重新编码,在代码中设置标题。像这样:

<title></title>
<asp:contentPlaceHolder><title>Rise Sir...</title><asp:contentPlaceHolder>

简单。

答案 7 :(得分:0)

我认为使用:

如果您想在页面级别设置标题

<%@ Master ... %>
<html>
<head runat="server">
  <title>
    <asp:ContentPlaceHolder ID="titleContent" runat="server" />
  </title>
</head>

或者,

如果要在母版页级别设置动态标题。

<%@ Master ... %>
<html>
<head runat="server">
  <title>
    <asp:Literal ID="litPageTitle" runat="server"></asp:Literal>
  </title>
</head>

是确保不生成空的第二个标题标记的更好方法。