ASP.NET Core 6.0:是否可以从 IModelBinder.BindModelAsync 访问控制器实例

ASP.NET Core 6.0: Is it possible to access the controller instance from IModelBinder.BindModelAsync

提问人:boggy 提问时间:11/3/2023 最后编辑:Progmanboggy 更新时间:11/3/2023 访问量:46

问:

在 ASP.NET MVC(在 .NET 4.8 上)中,我有:

public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
    if (bindingContext == null)
        throw new ArgumentNullException("bindingContext");

    var controller = actionContext.ControllerContext.Controller as AppController;
   
    if (controller == null)
        return true;
    // ....
}

控制器上下文具有控制器属性,我可以通过该属性获取控制器的实例。

如何在 asp.net Core 6.0 中访问在 BindModelAsync 中执行的控制器实例?参数中传递的对象似乎都没有指向控制器的实例,除非我遗漏了什么。下面是控制器上下文文档。 ControllerContext.ControllerActionDescriptor 指向除控制器实例之外的任何内容。ModelBindingContext

谢谢

C# -核心 MVC ASP.NET 核心 6.0

评论


答:

0赞 Ruikai Feng 11/3/2023 #1

您可以尝试以下方式获取控制器的实例:

var factory= bindingContext.HttpContext.RequestServices.GetService<IControllerFactory>();
var controllercontext = bindingContext.ActionContext as ControllerContext;
//add null check before this line
var controllerinstance = factory.CreateController(controllercontext);

评论

0赞 boggy 11/3/2023
是创建控制器还是获取控制器?factory.CreateController(controllercontext)
0赞 Ruikai Feng 11/3/2023
它将创建当前控制器的副本,您想要当前控制器的意图吗?您还有什么要求?
0赞 boggy 11/3/2023
我正在将应用程序从 .net framework 转换为 .net core,并且我有这个绑定器,它调用控制器实现的方法(控制器从公共类继承该方法)。我想我可以将该方法移动到服务并通过 DI 获取服务,但我想知道仍然可以像在 .Net 4.8 中那样获取控制器实例。
0赞 Ruikai Feng 11/3/2023
现在所有的控制器都继承自 ControllerBase 类,我认为你必须将方法移动到服务中并从 di 容器中获取服务