c# - 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.cshtml
在ExtenalLogins.cshtml
布局文件中不起作用。例如ViewData["Title"]
总是空的,但ViewData
我在其中设置的_ViewStart
是工作。
ViewData
问题是,当我使用共享视图文件夹中的布局时,如何使用脚手架身份文件?
编辑1:
看来问题出在这一行:
ViewData["ThisOneWorks"] = "some value";
当我从 中删除它时_ViewStart
,所有其他ViewData
s 都可以正常工作,但是为什么呢?
解决方案
好吧,我花了很多时间来重现同样的问题并进行调试。最后,我发现这是一个已知的错误。
- 在什么情况下会出现错误?
如果您尝试渲染具有关联的页面_ViewStart.cshtml
,并且同时设置了ViewData
,ViewStart
则_Layout.cshtml
将无法ViewData
正确渲染。
- 它不能工作的原因。
简而言之,原因是 insideViewData
是Layout
,ViewContext.ViewData
而不是this.ViewData
您在页面中设置的。看这里的详细解释
- 随便走走
该错误已在 中修复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>
推荐阅读
- java - javax.persistence.PersistenceException:org.hibernate.exception.SQLGrammarException:无法提取结果集
- python - API 调用引发错误但返回结果
- r - 连续行的时间差
- javascript - 如何验证来自数组React js中索引的用户输入
- python - 将 Pandas 数据框插入 SQL Server 临时表:表级约束或索引未指定列列表
- angular - 使用 Angular Material matMenu 作为上下文菜单
- python - 将十进制数转换为布尔数组
- javascript - Firebase Javascript 使用 UID 检索用户详细信息
- kubernetes - kubernetes/kubectl 有没有办法在使用 rollout undo 后前滚更新?
- javascript - 从其他对象返回匹配键的值列表。(两个对象的交集)