2

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

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

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

1 回答 1

0

我不是 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 实体。想象一个场景,其中用户发布了一个您的存储库中不存在的新实体。您的控制器将不得不做一些额外的工作来检查该实体是否真的存在于您的存储库中。

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

于 2013-01-15T16:17:08.090 回答