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

问题描述 投票:0回答:2

已编辑

我有一个 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"]
始终为空,但我在
ViewData
中设置的
_ViewStart
正在工作。

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

ViewData

编辑1:

问题似乎出在这一行:

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

当我将其从

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

c# asp.net asp.net-mvc asp.net-core razor-pages
2个回答
6
投票

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

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

如果您尝试渲染具有关联

_ViewStart.cshtml
的页面,并且同时在
ViewData
内设置
ViewStart
,则
_Layout.cshtml
将无法正确渲染其
ViewData

  1. 无法工作的原因.

简单来说就是因为

ViewData
中的
Layout
ViewContext.ViewData
,而不是你在页面中设置的
this.ViewData
。请参阅这里的详细说明

  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>

0
投票

如果要将 ViewData 属性传递给布局,请使用 ViewData 属性

[ViewData]
public string Title {get; set;}
© www.soinside.com 2019 - 2024. All rights reserved.