【发布时间】:2020-12-31 22:34:44
【问题描述】:
我们已将我们的应用程序转换为 ASP.NET Core,但我遇到了正确填充 ViewBag 的问题。我们有以下基本控制器
public abstract class ControllerBase : Controller
{
public ControllerBase()
{
ViewBag.Title = "MySite";
}
...// lots of other stuff here also
}
我们所有的其他控制器都继承自 ControllerBase,但是当我们到达视图并使用以下内容时
@{
ViewBag.Title = ViewBag.Title + " - " + Model.PageTitle;
}
但在视图中ViewBag.Title 为空。它不会导致错误,但我们最终会得到浏览器标题的“ - MyPage”而不是“MySite - MyPage”。
这一切在以前版本的 .net 中都可以正常工作,只是现在在 ASP.NET Core 中不能正常工作。当我逐步调试调试器时,我看到 ControllerBase 构造函数正在被调用,但 ViewBag 数据没有持久化。
这给我留下了两个问题:
- 在 ASP.NET Core 中是否有一些新的/不同的东西改变了 ViewBag 的范围?
- 解决此问题的最佳方法是什么? (没有在一堆地方添加价值。)
编辑:
我在基本控制器的第一行设置了一个调试器停止,并将ViewBag.Title 设置为我的监视变量。当我逐步完成时,我可以看到值被设置,然后我从基本控制器移动到特定动作控制器的构造函数。当我逐步执行该构造函数时,ViewBag.Title 仍然设置。只要我点击Index() 方法的第一行,ViewBag.Title 就会变成null。
编辑2: 这是一个说明问题的简单 foo 项目 https://github.com/nurdyguy/ViewBagIssue
【问题讨论】:
-
您如何单步调试您的代码并查看
ViewBag.Title被覆盖的位置? -
我没有看到它在任何地方被覆盖。在我所在的任何地方(除了基本控制器),值都是空的。
-
您确定您正在调试的控制器实际上继承了
ControllerBase? viewbag 没有什么特别之处,它只是一个普通的属性。继承不应破坏这一点。 -
我想说请发布所有相关代码。
-
我很肯定所有有问题的控制器都继承自 ControllerBase。
标签: c# asp.net-core asp.net-core-mvc