1

I have an MVC Masterpage.

Within the body, I have a placeholder for a title that all the views using this masterpage populate:

<asp:ContentPlaceHolder ID="TitleContent" runat="server" />

But as well as this title being used how it is, I want the exact same text to go in the title section of the head tag.

Of course, I could use another placeholder and make every single view specify the same content twice, but it would be better if some code could magically copy the literal text out of the placeholder and put it into the head title tag as well.

Obviously Javascriptis no use, because google wont process it to the page title. So I need to do this serverside.

4

3 回答 3

1

首先大卫的答案是正确的

实际实施将是whatever.master

<!DOCTYPE html>
<html>
    <head>
        <title><%= ViewData["Title"] %></title>
    </head>
    <body>
        <asp:ContentPlaceHolder ID="TitleContent" runat="server"/>
    </body>
</html>

在你看来

<asp:Content ContentPlaceHolderID="TitleContent" runat="server">
    <%= ViewData["Title"] %> 
</asp:Content>

在控制器中更改它

public ActionResult Index()
{
    ViewData["Title"] = "My new title";
    return View();
}

或者在视图本身中设置

<script runat="server">
    ViewData["Title"] = "My new title";
</script>

<asp:Content ContentPlaceHolderID="TitleContent" runat="server">
    <%= ViewData["Title"] %> 
</asp:Content>

由于这些是可变的,请在您喜欢的页面中的任何位置使用它们

// These are the same
ViewData["Title"] = "My new title";
ViewBag.Title     = "My new title";

// These are the same
<%= ViewData["Title"] %>
<%= ViewBag.Title %>

public Dictionary<string, object> ViewData
public dynamic ViewBag // .NET 4.0 +
于 2013-07-18T22:14:41.637 回答
1

通常,您会将视图中的这些值绑定到模型上的数据,或者可能在ViewBag(或ViewData对于旧版本的 MVC)或类似性质的数据中。因此,在您的布局(母版页?必须是 MVC 的旧版本?)中,您可能有几个对ViewBag(或ViewData)值的引用。像这样的东西:

<html>
    <head>
        <title><%= ViewBag.PageTitle %></title>
    </head>
    <body>
        <div id="somePageTitle"><%= ViewBag.PageTitle %></div>
    </body>
</html>

或者:

<html>
    <head>
        <title><%= ViewData["PageTitle"] %></title>
    </head>
    <body>
        <div id="somePageTitle"><%= ViewData["PageTitle"] %></div>
    </body>
</html>

然后在您的控制器中,您将根据需要设置该值:

ViewBag.PageTitle = "This is a page title";

或者:

ViewData["PageTitle"] = "This is a page title";

这会将该值绑定到视图中的两个位置。ViewBag对布局(母版页)中的元素使用(或其他结构,例如ViewDataand TempData,通常取决于所使用的 MVC 版本)以及对特定视图中的元素使用视图模型更为常见。

于 2013-07-18T21:22:07.513 回答
0

感谢你的帮助。

我想在视图中设置数据,因为我有不同的控制器使用相同的视图,而且一些控制器根据逻辑返回不同的视图,所以在视图上定义页面标题是有意义的,它是一个已知实体,特别是因为它通常不是模型数据,因此始终是该页面的常量文本。

一个复杂的情况是,如果要将视图设置从模型中获取的动态数据,尚未计算(例如延迟执行 iqueryable),则除非您填充母版页,否则母版页永远不会实现该值在页面较高点的视图中。

换句话说,视图必须在脚本中的内容占位符中设置视图数据,它将在母版页中的位置。如果母版页在 head 部分中使用它,则不能在正文内容中设置 viewdata[] 属性。

这有效:

<head>
    <asp:Placeholder ID="HeadContent" runat="server"/>
    <title><%: ViewData["PageTitle"] %></title>
</head>
<body>
    <%: ViewData["PageTitle"] %>
</body>

然后在视图中可以设置标题:

<asp:Content ContentPlaceHolderID="HeadContent" runat="server">
    <% ViewData["PageTitle"] = Model.SomeValueThatHasDefferedExecution; %>
</asp:Content>
于 2013-07-19T15:52:37.713 回答