【问题标题】:ASP.NET Core - IModelBinder - Access controller DbContextASP.NET Core - IModelBinder - 访问控制器 DbContext
【发布时间】:2017-10-10 12:40:16
【问题描述】:

我有一个基于 ASP.NET 2 的 MVC 解决方案,带有一个通用控制器和一个自定义绑定器。

控制器代码如下:

public class GenericController<T> : Controller where T : BaseModel
{
    public readonly AppContext Db = new AppContext();

    ...

    public virtual ActionResult Edit([ModelBinder(typeof(MyCustomBinder))] T obj)

所以,基本上,当我调用 Edit 操作时,会调用 MyCustomBinder 类。

MyCustomBinderClass(继承自DefaultModelBinder)需要重写:

protected override PropertyDescriptorCollection GetModelProperties(ControllerContext controllerContext, ModelBindingContext bindingContext)
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)

并且这两种方法都引用了“调用”控制器。

所以我可以通过以下方式访问控制器的 DbContext:

dynamic controller = controllerContext.Controller;
dynamic db = controller.Db;

--

现在,我正在切换到 ASP.NET 核心。为了创建自定义绑定器,我需要实现 IModelBinder,所以我需要实现:

public Task BindModelAsync(ModelBindingContext bindingContext)

问题是,如何访问调用控制器的 DbContext?

我需要它才能对数据库数据执行操作。

第一个想法是在我的应用程序中只有一个上下文,这显然是错误的(并导致运行时错误)。

但是我仍然需要在调用控制器和自定义绑定器中都有相同的上下文;否则,由于实体在 2 个不同的上下文中被修改,这也会导致错误。

知道如何解决这个问题吗?

谢谢!

【问题讨论】:

    标签: asp.net asp.net-core asp.net-core-mvc dbcontext imodelbinder


    【解决方案1】:

    我建议不要手动更新 DbContext,而是从依赖注入中获取其实例。

    话虽如此,您可以通过构造函数注入轻松获得DbContext

    public class MyCustomBinder : IModelBinder
    {
        private readonly AppDbContext _dbContext;
    
        public MyCustomBinder(AppDbContext dbContext)
        {
            _dbContext = dbContext;
        }
    
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            ...
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      • 2020-04-05
      • 2021-01-06
      • 2023-01-28
      • 2022-08-03
      • 1970-01-01
      相关资源
      最近更新 更多