ASP.NET Core 2.1 中未将 ViewData 传递给布局
ViewData is not passed to layout in ASP.NET Core 2.1
已编辑
我有一个 ASP.NET 核心 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
s(例如 SetPassword.cshtml
、ExtenalLogins.cshtml
、...)在布局文件中不起作用。例如 ViewData["Title"]
始终为空,但我在 _ViewStart
中设置的 ViewData
有效。
问题是,当我使用共享视图文件夹中的布局时,如何使用脚手架标识文件中的 ViewData
?
编辑 1:
看来问题出在这一行:
ViewData["ThisOneWorks"] = "some value";
当我从 _ViewStart
中删除它时,所有其他 ViewData
都可以正常工作,但为什么呢?
好吧,我花了很多时间来重现同样的问题并进行调试。最后,我发现这是一个已知错误。
- 什么情况下会出现bug?
如果您尝试呈现具有关联 _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>
已编辑
我有一个 ASP.NET 核心 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
s(例如 SetPassword.cshtml
、ExtenalLogins.cshtml
、...)在布局文件中不起作用。例如 ViewData["Title"]
始终为空,但我在 _ViewStart
中设置的 ViewData
有效。
问题是,当我使用共享视图文件夹中的布局时,如何使用脚手架标识文件中的 ViewData
?
编辑 1:
看来问题出在这一行:
ViewData["ThisOneWorks"] = "some value";
当我从 _ViewStart
中删除它时,所有其他 ViewData
都可以正常工作,但为什么呢?
好吧,我花了很多时间来重现同样的问题并进行调试。最后,我发现这是一个已知错误。
- 什么情况下会出现bug?
如果您尝试呈现具有关联 _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>