2012-12-31 23 views
2

我有bindingBase.ValueProvider.GetValue(bindingContext.ModelName)ModelBinding,它返回null,但如果我使用bindingContext.ValueProvider.GetValue(「id」)是返回正確的記錄。任何想法缺少什麼?我應該以某種方式註冊模特類嗎?ModelBindingContext.ValueProvider.GetValue(bindingContext.ModelName)返回null

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); 
    } 

回答

0

我不是MVC的專家,但我有一個想法,你的問題。我假設你正試圖從你的工作單位獲得一個比爾實體。您的操作方法定義參數Bill bill。這意味着MVC將把bindingContext.ModelName設置爲「賬單」,而不是「id」。

我不建議通過模型綁定來獲取Bill實體,而是建議在控制器中使用您的工作單元。所以,編輯操作也能像

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

和你的控制器構造可能是這樣的:

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

這是假設你正在使用DI。

我認爲,使用模型聯編程序從存儲庫獲取實體可能是危險的。除非您的GetByID方法拋出異常,否則MVC將繼續在請求數據中搜索Bill實體。設想一個場景,用戶發佈一個新的實體,該實體在您的存儲庫中不存在。你的控制器將不得不做一些額外的工作來檢查這個實體是否真的存在於你的倉庫中。

你最好在控制器內使用你的工作單元。