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

时间:2013-07-18 21:15:15

标签: c# asp.net-mvc

我有一个MVC主页。

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

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

但是除了这个标题的使用情况之外,我希望完全相同的文字出现在head标签的 title 部分。

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

显然Javascript没用,因为谷歌不会将它处理到页面标题。所以我需要在服务器端执行此操作。

3 个答案:

答案 0 :(得分: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(或其他构造,如ViewDataTempData,通常取决于所使用的MVC版本)布局中的元素(母版页)和使用视图特定视图中元素的模型。

答案 1 :(得分: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 +

答案 2 :(得分:0)

感谢您的帮助。

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

一个复杂的问题是,如果视图 被设置为从模型中获取的动态数据片段,那还没有被计算过(例如延迟执行iqueryable),那么除非您在页面中较高点的视图中填充它,否则母版页永远不会实现该值。

换句话说,视图必须在内容占位符ABOVE中的脚本中设置viewdata,它将位于母版页中。如果母版页在头部中使用它,则无法在正文内容中设置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>