【问题标题】:ModelBindingContext.ValueProvider.GetValue(bindingContext.ModelName) returns nullModelBindingContext.ValueProvider.GetValue(bindingContext.ModelName) 返回 null
【发布时间】:2012-12-15 21:34:48
【问题描述】:

我有用于 ModelBinding 的 bindingContext.ValueProvider.GetValue(bindingContext.ModelName) 并且它返回 null,但是如果我使用 bindingContext.ValueProvider.GetValue("id") 则返回正确的记录。任何想法缺少什么?我应该以某种方式注册模型类吗?

public class EntityModelBinder<TEntity>: IModelBinder where TEntity : Entity
{
    private readonly IUnitOfWork unitOfWork;

    public EntityModelBinder(IUnitOfWork unitOfWork)
    {
        this.unitOfWork = unitOfWork;
    }

    public object BindModel(ControllerContext controllerContext,
        ModelBindingContext bindingContext)
    {
        ValueProviderResult value =  bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        var id = Guid.Parse(value.AttemptedValue);

        var entity = ((IGenericRepository<TEntity>)unitOfWork.GetRepository(typeof(TEntity))).GetByID(id);

        return entity;
    }
}

控制器调用是“Bill”是我的实体类之一,它是 UnitOfWork 的一部分:

public ActionResult Edit(Bill bill)
    {            
        var model = Mapper.Map<Bill, BillEditModel>(bill);
    return View("Edit",model);
    }

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 model-binding modelbinders


    【解决方案1】:

    我不是 mvc 方面的专家,但我对您的问题有所了解。我假设您正在尝试从您的工作单元中获取 Bill 实体。您的操作方法定义了参数Bill bill。这意味着 MVC 会将bindingContext.ModelName 设置为“bill”,而不是“id”。

    我建议不要尝试通过模型绑定来获取 Bill 实体,而是在控制器中使用您的工作单元。所以编辑动作可能像

    public ActionResult Edit(Guid id)
    {
         Bill bill = _unitOfWork.GetByID(id);
    }
    

    你的 Controller 构造函数可能是这样的:

    public MyController(IUnitOfWork uow) {
        _unitOfWork = uow;
    }
    

    这是假设您使用的是 DI。

    我认为,使用模型绑定器从存储库中获取实体可能很危险。除非您的 GetByID 方法抛出异常,否则 MVC 将继续在请求数据中搜索 Bill 实体。想象一个场景,其中用户发布了一个您的存储库中不存在的新实体。你的控制器必须做一些额外的工作来检查这个实体是否真的存在于你的存储库中。

    你最好在控制器中使用你的工作单元。

    【讨论】:

      猜你喜欢
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 2019-08-21
      相关资源
      最近更新 更多