ASP.NET MVC - 如何在带有母版页的视图中设置标题?

16

在使用母版页时,设置视图的html标题(在head标签中)的首选方法是什么?

一种方法是在.aspx文件中使用Page.Title,但这需要在母版页中添加<asp:contentplaceholder>,这可能会混淆HTML代码。因此,假设没有服务器端控件,只有纯html。还有更好的想法吗?

更新:我想在视图中设置标题,而不是在控制器或模型中设置。

11个回答

33

在我们的母版页中,我们创建了一个“init” ContentPlaceHolder和一个“title” ContentPlaceHolder。如果有人想以编程方式设置Page.Title,他们可以在init占位符中用CSharp设置它,或者使用标签覆盖“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>

查看页面 可以覆盖整个 "title" 内容占位符:

<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。


如果您打算从视图顶部的Title =“”指令中填充标题,则只需要在head标记中使用runat =“server”。否则最好将其省略。 - UpTheCreek
这太完美了 - 我需要一种支持在传统的基于Web Forms的视图中实现此功能的方法。当然,通过使用ViewBag.propertyName语法,它已经在Razor中得到了支持,可以在声明布局页面之前引导所有Razor视图。再次感谢! - Rob

11

我看到很多人使用 <%= ViewData["Title"] %> 选项。

我想你也可以插入一个名为“Title”的ContentPlaceHolder,然后只需在页面上使用它,但在我看过的所有MVC示例中,它们都使用第一种选项。


2
当我创建一个新的MVC项目时,它会有一些文件并使用一个主页面。看起来它将标题传递给ViewData作为ViewData["Title"],在主页面中,在<head>中有一个脚本块,输出ViewData["Title"]。

1

最终我采用了code-behind文件来实现在Page_Load()方法中使用Page.Title="..."

虽然我不太喜欢这样做,但是直接在.aspx页面中尝试实现更改并没有成功,因为这导致了两个<title>标签的存在,一个是我生成的,另一个是该页面从Master文件继承而来生成的。

理想情况下,我的页面代码应该覆盖主文件的<title>值,但我猜这只是ASP.Net MVC仍然存在的小问题之一,并且在ASP.Net MVC框架的新版本中可能已经得到修复(我们仍在使用ASP.Net MVC Beta)。


1

你可以在你的母版页中这样做:

<title>
    <%:MyTitle + " :: " %>
    <asp:ContentPlaceHolder ID="TitleContent" runat="server">
    </asp:ContentPlaceHolder>
</title>

在这里,MyTitle可以从您的web.config中获取某个值,或者硬编码为"My Web"。

现在在视图页面(例如Index)中:

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
<%:"My Home Page"%>

现在当您浏览您的主页时,标题将会是"My Web :: My Home Page"。

1
嗨,我喜欢这种方法!它有效!我对它进行了一些修改,将“::”分隔符从主页面放到视图页面中,这样我们就可以避免在主页上显示空的“::”。 - Jony

0
我创建了一个名为 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> 

0

我有一个基础视图类,可以从资源文件设置页面标题。对我来说效果不错。


-1

内容页的@Page指令有一个Title属性。


1
是的,但我之前说过,这需要在主页面中使用< head runat = server>,这不是我想要的。 - bh213
1
你的问题是无意义的,因为你说你想使用服务器端构造设置内容页的标题,但你又不想使用服务器端构造。 - sliderhouserules
好的,我想避免使用任何aspx控件。<head runat = server>会吃掉我们使用的一些html,虽然我们可以解决这个问题,但我更喜欢只使用纯html。但母版页和控件应该是可以接受的。 - bh213
如果您正在使用MVC,您真的不应该依赖于“runat = server”之类的东西。否则,您为什么要使用MVC :) - Timothy Khouri
1
因为MVC是一种设计模式,与整个“纯粹主义者”在aspx页面中编写所有内容的争论无关。 - sliderhouserules
顺便说一句... "是的,但我在上面说过,它需要主页面中的<head runat=server>,这不是我想要的。" 你在帖子中没有说过那个,如果那是你想说的话,你应该重新阅读你发布的内容并修正它。校对很重要。 - sliderhouserules

-1
对于 ASP.NET 内容页,只需在 <%@ %> 占位符中添加 Title="" 即可。

-4

我们最终得到了

<head runat=server visible=false>

在主页面中。

这样我们就可以从Page.Title读取(Page.Title需要head元素存在,否则会抛出异常,使用反射器进行了检查)。然后我们使用自己的head元素 - MVC方式。


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