ModelBindingContext.ValueProvider.GetValue(bindingContext.ModelName)返回null

时间:2012-12-31 22:11:57

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

我有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;
    }
}

Controller Call是“Bill”是我的实体类之一,它是UnitOfWork的一部分:

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

1 个答案:

答案 0 :(得分:0)

我不是mvc的专家,但我对你的问题有所了解。我假设你正试图从你的工作单位获得一个比尔实体。您的操作方法定义参数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实体。想象一个场景,用户发布您的存储库中不存在的新实体。您的控制器必须做一些额外的工作来检查该实体是否确实存在于您的存储库中。

最好在控制器内使用您的工作单元。