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";

现在的问题是,我从脚手架页面设置的ViewDatas(例如SetPassword.cshtmlExtenalLogins.cshtml、...)在布局文件中不起作用。例如ViewData["Title"] 始终为空,但我在_ViewStart 中设置的ViewData 可以正常工作。

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

编辑 1:

看来问题出在这一行:

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

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

【问题讨论】:

代码是否在公共仓库中? 您是否尝试过使用不带感叹号 (!) 的索引字符串,例如ViewData[“标题”] @MohsinMehmood 是的,这只是 SO 问题中的一个示例。我在代码中使用了另一个索引字符串,它只有英文字符。 【参考方案1】:

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

    在什么情况下会出现错误?

如果您尝试渲染具有关联_ViewStart.cshtml 的页面,并且同时在ViewStart 中设置ViewData,则_Layout.cshtml 将无法正确渲染其ViewData

    不能工作的原因。

简而言之,原因是Layout 中的ViewDataViewContext.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?

asp.net mvc 如何实现自动提交或保留用户未登录前得信息

.NET开发——MVC5之数据传递应用

asp.net 核心环境变量未传递给 vuejs 配置

Asp.net MVC中 Controller 与 View之间的数据传递