已编辑
我有一个 ASP.NET Core 2.1 网站,我已经搭建了它的所有身份项目。脚手架进程在此位置创建了一个布局文件:
/Areas/Identity/Pages/Account/Manage/_Layout.cshtml
因为我想全局使用布局,所以我已将布局文件(使用剪切粘贴)移动到这个新位置:
/Views/Shared/AdminLayout/_Layout.cshtml
然后在第一个位置创建一个
_ViewStart.cshtml
文件以使用第二个位置中的布局。 _ViewStart
文件的内容是这样的:
@{
Layout = "/Views/Shared/AdminLayout/_Layout.cshtml";
ViewData["ThisOneWorks"] = "some value";
}
现在的问题是,我从脚手架页面设置的
ViewData
(例如SetPassword.cshtml
,ExtenalLogins.cshtml
,...)在布局文件中不起作用。例如 ViewData["Title"]
始终为空,但我在 ViewData
中设置的 _ViewStart
正在工作。
问题是,当我使用共享视图文件夹中的布局时,如何使用脚手架身份文件中的
ViewData
?
编辑1:
问题似乎出在这一行:
ViewData["ThisOneWorks"] = "some value";
当我将其从
_ViewStart
中删除时,所有其他 ViewData
都可以正常工作,但为什么呢?
嗯,我花了很多时间来重现相同的问题并进行调试。最后,我发现这是一个已知的错误。
如果您尝试渲染具有关联
_ViewStart.cshtml
的页面,并且同时在 ViewData
内设置 ViewStart
,则 _Layout.cshtml
将无法正确渲染其 ViewData
。
简单来说就是因为
ViewData
中的Layout
是ViewContext.ViewData
,而不是你在页面中设置的this.ViewData
。请参阅这里的详细说明
该错误已在
2.2.0-preview1
中修复,不幸的是,2.1.x
中没有修复它的计划。如果您不想更新您的 sdk ,您可以使用 HttpContext.Items
。在 RazorPage 中设置 Items
:
@{
ViewData["Title"] = "Profile"; // not working
HttpContext.Items["Title"]="Workaround - Title"; // workaround
}
在您的
Items
中渲染 _Layout
:
<h1>@Context.Items["Title"]----render in layout</h1>
如果要将 ViewData 属性传递给布局,请使用 ViewData 属性
[ViewData]
public string Title {get; set;}