【发布时间】:2008-11-28 20:40:13
【问题描述】:
在使用母版页时,为视图设置 html 标题(在头部)的首选方式是什么?
一种方法是在 .aspx 文件中使用 Page.Title,但这需要在母版页中使用,这可能会与 HTML 代码混淆。所以,让我们假设没有服务器端控件,只有纯 html。有更好的想法吗?
更新:我想在视图中设置标题而不是在控制器或模型中。
【问题讨论】:
标签: asp.net asp.net-mvc master-pages
在使用母版页时,为视图设置 html 标题(在头部)的首选方式是什么?
一种方法是在 .aspx 文件中使用 Page.Title,但这需要在母版页中使用,这可能会与 HTML 代码混淆。所以,让我们假设没有服务器端控件,只有纯 html。有更好的想法吗?
更新:我想在视图中设置标题而不是在控制器或模型中。
【问题讨论】:
标签: asp.net asp.net-mvc master-pages
在我们的母版页中,我们创建了“init”ContentPlaceHolder 和“title”ContentPlaceHolder。如果有人想以编程方式设置 Page.Title,他们可以在 CSharp 中的 init 占位符中设置它,或者他们可以使用标签覆盖“title”占位符。
母版页
<asp:ContentPlaceHolder id="init" runat="server"></asp:ContentPlaceHolder>
<head runat="server">
<asp:ContentPlaceHolder ID="title" runat="server">
<title><%=this.Page.Title%></title>
</asp:ContentPlaceHolder>
</head>
查看页面 可以覆盖整个“标题”内容占位符:
<asp:Content ID="Content1" ContentPlaceHolderID="title" runat="server">
<title>Home Page</title>
</asp:Content>
或以编程方式设置页面标题。
<asp:Content ID="Content1" ContentPlaceHolderID="init" runat="server">
<%this.Title = "Home Page";%>
</asp:Content>
确保从顶部的 Page 指令中删除 Title="",否则您将无法以编程方式更改 Page.Title。
【讨论】:
我看到很多人使用<%= ViewData["Title"] %> 选项。
我想你也可以插入一个名为 Title 的 ContentPlaceHolder,然后在你的页面上使用它,但是在我见过的所有 MVC 示例中,它们都使用第一个选项。
【讨论】:
当我创建一个新的 MVC 项目时,其中包含文件并使用母版页。看起来它似乎将标题作为 ViewData["Title"] 传递给 ViewData,并且在母版页中,<head> 中有一个输出 ViewData["Title"] 的脚本块。
【讨论】:
我最终使用代码隐藏文件在Page_Load() 方法中实现Page.Title="..."。
我不喜欢这样做,但是尝试直接在 .aspx 页面中实现更改没有奏效,因为它导致出现两个 <title> 标记,一个是我生成的,另一个是由页面继承自的主文件。
理想情况下,我的页面代码应该覆盖主文件的 <title> 值,但我想这只是 ASP.Net MVC 仍然存在的那些怪癖之一,并且可能已经在较新版本的ASP.Net MVC 框架(我们仍在使用 ASP.Net MVC Beta)
【讨论】:
您可以在母版页中执行此操作:
<title>
<%:MyTitle + " :: " %>
<asp:ContentPlaceHolder ID="TitleContent" runat="server">
</asp:ContentPlaceHolder>
</title>
其中 MyTitle = 来自您的 web.config 或硬文本(如“我的网站”)的某个值
现在在视图页面中(例如索引):
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
<%:"My Home Page"%>
现在,当您浏览主页时,标题将是“My Web :: My Home Page”。
【讨论】:
我有一个从资源文件设置页面标题的基本视图类。对我来说效果很好。
【讨论】:
我用 Title 属性创建了一个名为 Application 的类(使用 get/set):
public static class Application
{
static string title;
public static string Title
{
get { return title; }
set { title = value; }
}
}
然后我为每个页面设置 Page_Load 事件的属性:
Application.Title = "Silly Application";
然后我只是在母版页上引用该属性:
<div id="divApplicationTitle">
<asp:HyperLink runat="server" NavigateUrl="~/Default.aspx"><asp:Image ID="imgApplicationImage" runat="server" SkinID="skinApplicationLogo" /><%=Application.Title%></asp:HyperLink>
</div>
【讨论】:
@Page 指令有一个 Title 属性,用于内容页面。
【讨论】:
对于 ASP.NET 内容页面,只需在 <%@ %> 占位符中添加 Title=""。
【讨论】:
我们最终得到了
<head runat=server visible=false>
在母版页中。
这样我们可以从 Page.Title 中读取(Page.Title 需要 head 元素存在,否则会抛出异常,用反射器检查)。然后我们使用我们自己的 head 元素 - MVC 方式。
【讨论】:
您始终可以在视图页面中使用 javascript:
<script type="text/javascript>
document.title = "Hello World";
</script>
【讨论】: