ViewData 未传递给 ASP.NET Core 2.1 中的布局
Posted
技术标签:
【中文标题】ViewData 未传递给 ASP.NET Core 2.1 中的布局【英文标题】:ViewData is not passed to layout in ASP.NET Core 2.1 【发布时间】:2019-03-09 01:36:36 【问题描述】:已编辑
我有一个 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
s(例如SetPassword.cshtml
、ExtenalLogins.cshtml
、...)在布局文件中不起作用。例如ViewData["Title"]
始终为空,但我在_ViewStart
中设置的ViewData
可以正常工作。
问题是,当我使用共享视图文件夹中的布局时,如何使用脚手架身份文件中的ViewData
?
编辑 1:
看来问题出在这一行:
ViewData["ThisOneWorks"] = "some value";
当我从_ViewStart
中删除它时,所有其他ViewData
s 都可以正常工作,但是为什么呢?
【问题讨论】:
代码是否在公共仓库中? 您是否尝试过使用不带感叹号 (!) 的索引字符串,例如ViewData[“标题”] @MohsinMehmood 是的,这只是 SO 问题中的一个示例。我在代码中使用了另一个索引字符串,它只有英文字符。 【参考方案1】:好吧,我花了很多时间来重现和调试相同的问题。最后,我发现这是一个已知的错误。
-
在什么情况下会出现错误?
如果您尝试渲染具有关联_ViewStart.cshtml
的页面,并且同时在ViewStart
中设置ViewData
,则_Layout.cshtml
将无法正确渲染其ViewData
。
-
不能工作的原因。
简而言之,原因是Layout
中的ViewData
是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
在您的_Layout
中渲染Items
:
<h1>@Context.Items["Title"]----render in layout</h1>
【讨论】:
这里似乎适用于 ViewContext.ViewData[],而不是 ViewData 或 HttpContext.ViewData.Items以上是关于ViewData 未传递给 ASP.NET Core 2.1 中的布局的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC中Controller与View之间的数据传递
如何通过 jQuery ajax 更新 ASP.NET MVC ViewData?