我需要动态设置页面的标题,因此我使用类似于以下内容的代码:
<%@ 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”)。
编辑:没关系。使用该方法使其工作。答案 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>
是确保不生成空的第二个标题标记的更好方法。