提问人:boggy 提问时间:11/3/2023 最后编辑:Progmanboggy 更新时间:11/3/2023 访问量:46
ASP.NET Core 6.0:是否可以从 IModelBinder.BindModelAsync 访问控制器实例
ASP.NET Core 6.0: Is it possible to access the controller instance from IModelBinder.BindModelAsync
问:
在 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
谢谢
答:
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 容器中获取服务
评论