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

标签 c# asp.net asp.net-mvc asp.net-core razor-pages

已编辑

我有一个 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.cshtmlExtenalLogins.cshtml、... ) 在布局文件中不起作用。例如,ViewData["Title"] 始终为空,但我在 _ViewStart 中设置的 ViewData 正在运行。

问题是,当我使用共享 View 文件夹中的布局时,如何使用脚手架标识文件中的 ViewData

编辑 1:

看来问题出在这一行:

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

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

最佳答案

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

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

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

  1. 无法正常工作的原因。

简而言之,原因是 Layout 中的 ViewDataViewContext.ViewData ,而不是 this。您在页面中设置的 ViewData。参见 the detailed explanation here

  1. 解决方法

该错误已在 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>

关于c# - ViewData 未传递到 ASP.NET Core 2.1 中的布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52633527/

相关文章:

c# - 如何在 UWP 中做三角按钮?

c# - 如何将 PL/SQL 输出 (clob) 保存为 XML 文件?

c# - Asp.net MVC 休眠 : Can not modify more than one base table through a join view

c# - 首先在 EF 代码中进行悲观锁定

c# - 获取 GridViewColumn 的父级

c# - 如何反转列表内容的显示顺序?

javascript - 如何从javascript调用this.Page(服务器页面)

javascript - 如何使用 AJAX 完全关闭模式框? - ASP.NET MVC

asp.net-mvc - 尝试实现 RenderPartial

c# Xamarin SQLite.Net 序列化模式无法正常工作?