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

C# 将占位符文本复制到第二个位置,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个MVC主页 在正文中,我有一个标题占位符,所有使用此母版页的视图都会填充该标题: <asp:ContentPlaceHolder ID="TitleContent" runat="server" /> 但是,除了这个标题是如何使用的,我希望完全相同的文本去标题部分的头标签 当然,我可以使用另一个占位符,让每个视图指定相同的内容两次,但如果一些代码能够神奇地将文字文本从占位符中复制出来,并将其放入head title标记中,那就更好了 显然JavaScription是没有

我有一个MVC主页

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

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

但是,除了这个标题是如何使用的,我希望完全相同的文本去标题部分的头标签

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


显然JavaScription是没有用的,因为google不会将其处理为页面标题。所以我需要在服务器端执行此操作。

一般来说,您可以将视图中的这些值绑定到模型上的数据,或者绑定到
视图包中的数据(或者对于旧版本的MVC,
视图数据
),或者类似的内容。因此,在您的布局(母版页?必须是旧版本的MVC?)中,您可能有一些对
ViewBag
(或
ViewData
)值的引用。大概是这样的:

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


这会将该值绑定到视图中的两个位置。对布局(母版页)中的元素使用
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>
或者在视图本身中设置它

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

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

ViewData[“标题”]=“我的新标题”;
因为它们是可变的,所以可以在页面中的任意位置使用它们

// 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 +
//这些是相同的
ViewData[“标题”]=“我的新标题”;
ViewBag.Title=“我的新标题”;
//这些都是一样的
公共字典视图数据
公共动态ViewBag//.NET 4.0+

谢谢你的帮助

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

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

换句话说,视图必须在母版页上的内容占位符中设置脚本中的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>


您使用的是哪个版本的MVC?不要使用占位符,使用ViewBag?WebForms是MVC可用的视图引擎。这是我们在Razoryeah之前的版本,mvc有一个@razor版本和一个asp.net版本,其中大多数控件仍然可以工作。我觉得它很难看,很粗糙,但它是从经典asp.net>mvc asp.net>mvc razorThanks迁移的一个很好的中间版本,我确实考虑过使用ViewData的这条路线。。。我正在使用MVC母版页,是的,asp占位符可以工作。我只是不喜欢做很多与视图相关的编程工作。页面的文本应该放在视图中,而不是控制器中。@NickBork:有一个ASPX视图引擎,它支持经典的
语法,当然。但是视图引擎本身并不是WebForms,这与MVC完全不同。我从未见过MVC中使用的服务器端控件。如果它们是从控制器代码中填充的,那么这将完全破坏MVC的结构以及它试图实现的关注点分离。因此,即使它能工作,也不能正确使用框架,也不推荐使用。@David我想你不明白,他没有使用“服务器端控件”。他发布的标记是如何定义Razor术语“部分”。他创建了一个占位符,以便在视图中设置值。这就是MVC WebFormsViewEngine(基于WebForms)的工作原理。你提供了误导性的信息。我知道您以前可能没有使用过此视图引擎,但您提供的信息不正确。ViewBag可用于MVC3及更高版本。ViewData在以前版本的MVC中可用。此方法可用于设置标题。
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 +
<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>