gpt4 book ai didi

asp.net - 在 ASP.NET MVC Core Controller 的构造函数中设置 ViewBag 属性

转载 作者:行者123 更新时间:2023-12-04 00:30:12 25 4
gpt4 key购买 nike

我的主题有某种面包屑。 Controller 始终是类别。为了避免重复自己,我想在 Controller 的构造函数中为所有这样的操作设置它:

class MyController:Controller{
public MyController() {
ViewBag.BreadcrumbCategory = "MyCategory";
}
}

当我访问 ViewBag.BreadcrumbCategory在布局 View 中,它为空。在一个 Action 中它起作用:
class MyController:Controller{
public IActionResult DoSomething() {
ViewBag.BreadcrumbCategory = "MyCategory";
}
}

我想知道在构造函数中设置 ViewBag 属性是不可能的?在执行此工作的每个操作上调用一个函数会很烦人,也不是好的做法。在 another question使用构造函数是一个公认的答案,但正如我所说,这不起作用,至少对于 ASP.NET Core 是这样。

最佳答案

有一个GitHub issue关于它,并声明这是设计使然。您链接的答案是关于 ASP.NET MVC3,旧的遗留 ASP.NET 堆栈。

ASP.NET Core 是从头开始编写的,并使用不同的概念,专为可移植性(多平台)以及性能和现代实践而设计,例如对依赖注入(inject)的内置支持。

最后一个导致无法设置ViewBag在构造函数中,因为 Constructor 的某些属性基类必须通过属性注入(inject)注入(inject),因为您可能已经注意到您不必在派生 Controller 中传递这些依赖项。

这意味着,当 Controller的构造函数被调用,属性为 HttpContext , ControllerContext等未设置。它们仅设置 之后 构造函数被调用,并且该对象有一个有效的实例/引用。

正如 GitHub 问题中所指出的,它不会被修复,因为这是设计使然。

如您所见here , ViewBag 依赖于 ViewDataViewData在 Controller 初始化后填充。如果您调用ViewBag.Something = "something" ,然后您将创建 DynamicViewData 的新实例类,将在构造函数初始化后替换为类。

正如@SLaks 指出的那样,您可以使用为每个 Controller 配置的操作过滤器。

以下示例假设您 总是 Controller 派生您的 Controller 基类。

public class BreadCrumbAttribute : IActionFilter
{
private readonly string _name;

public BreadCrumbAttribute(string name)
{
_name = name;
}

public void OnActionExecuting(ActionExecutingContext context)
{
base.OnActionExecuting(context);

var controller = context.Controller as Controller;
if (controller != null)
{
controller.ViewBag.BreadcrumbCategory = _name;
}
}
}

现在你应该可以用它来装饰你的 Controller 了。

[BreadCrumb("MyCategory")]
class MyController:Controller
{
}

关于asp.net - 在 ASP.NET MVC Core Controller 的构造函数中设置 ViewBag 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40330391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com