首页 > 解决方案 > ViewData 未传递给 ASP.NET Core 2.1 中的布局

问题描述

已编辑

我有一个 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我从脚手架页面(例如,...)设置的 sSetPassword.cshtmlExtenalLogins.cshtml布局文件中不起作用。例如ViewData["Title"]总是空的,但ViewData我在其中设置的_ViewStart是工作。

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

编辑1:

看来问题出在这一行:

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

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

标签: c#asp.netasp.net-mvcasp.net-corerazor-pages

解决方案


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

  1. 在什么情况下会出现错误?

如果您尝试渲染具有关联的页面_ViewStart.cshtml,并且同时设置了ViewDataViewStart_Layout.cshtml将无法ViewData正确渲染。

  1. 它不能工作的原因。

简而言之,原因是 insideViewDataLayoutViewContext.ViewData而不是this.ViewData您在页面中设置的。看这里的详细解释

  1. 随便走走

该错误已在 中修复2.2.0-preview1,遗憾的是没有计划在 中修复它2.1.x。如果你不想更新你的 sdk,你可以使用HttpContext.Items. Items在您的 RazorPage 中设置:

@{
    ViewData["Title"] = "Profile";                   // not working
    HttpContext.Items["Title"]="Workaround - Title"; // workaround
}

呈现Items在你的_Layout

<h1>@Context.Items["Title"]----render in layout</h1>

推荐阅读