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";
}

现在的问题是,我从脚手架页面设置的 ViewDatas(例如 SetPassword.cshtmlExtenalLogins.cshtml、...)在布局文件中不起作用。例如 ViewData["Title"] 始终为空,但我在 _ViewStart 中设置的 ViewData 有效。

问题是,当我使用共享视图文件夹中的布局时,如何使用脚手架标识文件中的 ViewData

编辑 1:

看来问题出在这一行:

ViewData["ThisOneWorks"] = "some value";

当我从 _ViewStart 中删除它时,所有其他 ViewData 都可以正常工作,但为什么呢?

好吧,我花了很多时间来重现同样的问题并进行调试。最后,我发现这是一个已知错误。

  1. 什么情况下会出现bug?

如果您尝试呈现具有关联 _ViewStart.cshtml 的页面,并且如果您同时在 ViewStart 中设置 ViewData,则 _Layout.cshtml将无法正确呈现其 ViewData

  1. 无法运行的原因。

简而言之,原因是 Layout 中的 ViewDataViewContext.ViewData,而不是您在页面中设置的 this.ViewData。参见 the detailed explanation here

  1. 解决方法

该错误已在 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>