将占位符文本复制到第二个位置
本文关键字:第二个 位置 复制 占位符 文本 | 更新日期: 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
(或其他构造,如ViewData
和TempData
,通常取决于所使用的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>