已编辑
我有一个 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"]
始终为空,但我在 _ViewStart
中设置的 ViewData
正在运行。
问题是,当我使用共享 View 文件夹中的布局时,如何使用脚手架标识文件中的 ViewData
?
编辑 1:
看来问题出在这一行:
ViewData["ThisOneWorks"] = "some value";
当我从 _ViewStart
中删除它时,所有其他 ViewData
都可以正常工作,但为什么呢?
最佳答案
好吧,我花了很多时间来重现同样的问题并进行调试。最后,我发现这是一个已知错误。
- 在什么情况下会出现错误?
如果您尝试呈现具有关联 _ViewStart.cshtml
的页面,并且如果您在 ViewStart
中设置 ViewData
同时,_Layout.cshtml
将无法正确呈现其 ViewData
。
- 无法正常工作的原因。
简而言之,原因是 Layout
中的 ViewData
是 ViewContext.ViewData
,而不是 this。您在页面中设置的 ViewData
。参见 the detailed explanation here
- 解决方法
该错误已在 2.2.0-preview1
中修复,遗憾的是没有计划在 2.1.x
中修复它。如果你不想更新你的 sdk ,你可以使用 HttpContext.Items
。在你的 RazorPage 中设置 Items
:
@{
ViewData["Title"] = "Profile"; // not working
HttpContext.Items["Title"]="Workaround - Title"; // workaround
}
在您的 _Layout
中呈现 Items
:
<h1>@Context.Items["Title"]----render in layout</h1>
关于c# - ViewData 未传递到 ASP.NET Core 2.1 中的布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52633527/