5

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

<%@ 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”都没有)。

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

4

8 回答 8

11

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

这里的大多数答案都是有效的,但是为了最小的改变,你可以做的是在你的头部控制中添加以下内容-

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

其他选项包括 -

  • 取消runat="server"头控制,但这意味着您不能使用服务器端控件
  • 使用 Title 控件并以编程方式设置它,就像您的解决方案一样。

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

有关这方面的背景,请参阅 Phil Haack 的这篇博客文章。

于 2011-08-08T06:09:30.580 回答
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";
}
于 2010-01-20T15:20:03.777 回答
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" %>

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

希望这可以帮助。

于 2010-03-18T19:23:41.757 回答
0

试试这个

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

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

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

     Title = "Your Page Title"

在您的 Page_Load 中。

于 2010-01-20T15:08:56.937 回答
0

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

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

于 2010-01-20T15:21:38.420 回答
0

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

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

因此,<asp:ContentPlaceHolder>将替换为,<asp:Content ContentPlaceHolderID="head">因此您最终得到了第二个<title>元素。

所以要么<title>从你的母版页中删除 - 这意味着你需要<title>在你的所有aspx 文件中 - 或者使用一些代码来做这样的事情......

this.Title = pageTitle;
// if that doesn't do it try
// this.Header.Title = pageTitle;
于 2010-01-20T15:26:05.323 回答
0

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

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

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

简单的。

于 2012-07-02T22:04:20.517 回答
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>

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

于 2013-05-03T04:43:23.373 回答