将占位符文本复制到第二个位置

本文关键字:第二个 位置 复制 占位符 文本 | 更新日期: 2023-09-27 18:23:46

我有一个MVC主页。

在正文中,我有一个标题的占位符,所有使用此母版页的视图都会填充该标题:

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

但是,除了这个标题的使用方式外,我还希望在head标签的标题部分中使用完全相同的文本。

当然,我可以使用另一个占位符,让每个视图指定两次相同的内容,但如果一些代码可以神奇地将文本从占位符中复制出来,并将其放入head title标记中,那会更好。

显然Javascript是没有用的,因为谷歌不会处理它的页面标题。所以我需要做这个服务器端。

将占位符文本复制到第二个位置

通常,您会将视图中的这些值绑定到模型上的数据,或者可能绑定到ViewBag(对于旧版本的MVC,则为ViewData)或类似性质的数据。因此,在您的布局(母版页?必须是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(或其他构造,如ViewDataTempData,通常取决于所使用的MVC版本),对于特定视图中的元素使用视图模型更为常见。

首先David的答案是正确的

实际实施为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 +

感谢您的帮助。

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

一个复杂的问题是,如果视图被设置为从模型中获取的尚未计算的动态数据(例如延迟执行iquryable),那么除非您在页面的更高点将其填充到视图中,否则母版页永远不会实现该值。

换句话说,视图必须在内容占位符ABOVE中设置脚本中的视图数据,该占位符将位于主页面中。如果母版页在标题部分使用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>