ViewData不会传递到ASP.NET Core 2.1中的布局

时间:2018-10-03 18:27:23

标签: c# asp.net asp.net-mvc asp.net-core razor-pages

已编辑

我有一个ASP.NET Core 2.1网站,我已将其所有Identity项目都安装了支架。脚手架过程在以下位置创建了一个布局文件:

/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.cshtmlExtenalLogins.cshtml等)在布局文件中不起作用。例如,ViewData["Title"]始终为空,但是我在ViewData中设置的_ViewStart正常工作。

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

编辑1:

问题似乎出在这行:

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

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

1 个答案:

答案 0 :(得分:5)

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

  1. 在哪种情况下会发生错误?

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

  1. 它无法正常工作的原因。

简而言之,原因是ViewData中的LayoutViewContext.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
}

在您的Items中渲染_Layout

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