已编辑
我有一个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.cshtml
,ExtenalLogins.cshtml
等)在布局文件中不起作用。例如,ViewData["Title"]
始终为空,但是我在ViewData
中设置的_ViewStart
正常工作。
问题是,当我使用共享视图文件夹中的布局时,如何使用脚手架标识文件中的ViewData
?
编辑1:
问题似乎出在这行:
ViewData["ThisOneWorks"] = "some value";
当我从_ViewStart
中删除它时,所有其他ViewData
都可以正常工作,但是为什么?
答案 0 :(得分:5)
好吧,我花了很多时间来重现相同的问题并进行调试。最后,我发现这是一个已知的错误。
如果您尝试呈现具有关联的_ViewStart.cshtml
的页面,并且同时在ViewData
中设置ViewStart
,则_Layout.cshtml
不会正确呈现其ViewData
。
简而言之,原因是ViewData
中的Layout
是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
}
在您的Items
中渲染_Layout
:
<h1>@Context.Items["Title"]----render in layout</h1>