2

我有一個從DefaultModelBinder繼承的自定義模型聯編程序。我想要它做的是在模型上設置一個屬性,這個屬性不能由DefaultModelBinder解決。它看起來像這樣:如何在修改後從DefaultModelBinder繼承的自定義模型綁定中重新驗證模型?

public class FooModelBinder : DefaultModelBinder { 
    public override void BindModel(ControllerContext controllerContext, ModelBindingContext modelBindingContext) 
    { 
    var model = base.BindModel(controllerContext, bindingContext); 
    ((IFooModel)model).Bar = GetBarFromSomewhere(); 

    return model; 
    } 
} 

然而,由於IFooModel酒吧屬性不能爲空,我使用FluentValidation與規則說,在ModelState中是無效的,我叫base.BindModel後。

所以我想或者在調用base.BindModel時避免驗證模型,或者至少清除錯誤並在設置Bar屬性後重新驗證模型。

我試圖解決驗證和驗證模型,但我似乎無法得到它的實際運行驗證,它不會以任何錯誤都會導致(即使它應該):

var validators = bindingContext.ModelMetadata.GetValidators(controllerContext); 
foreach(var validator in validators) { 
    foreach (var result in validator.Validate(model)) { 
     bindingContext.ModelState.AddModelError(result.MemberName, result.Message); 
    } 
} 

在我返回模型之前運行這個之後,驗證器包含一個FluentValidationModelValidator,但是當我調用validator.Validate時,我不會收到任何錯誤。我的模型上有另一個屬性,當我之前運行base.BindModel時確實會導致錯誤,所以我期望在這裏發生相同的錯誤。

回答

4

而是重寫BindModel方法,你可以嘗試重寫BindProperty方法:

public class FooModelBinder : DefaultModelBinder 
{ 
    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) 
    { 
     if (propertyDescriptor.Name == "Bar") 
     { 
      var model = bindingContext.Model as IFooModel; 
      if (model != null) 
      { 
       model.Bar = GetBarFromSomewhere(); 
      } 
     } 
     base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
    } 
} 
+0

完美,這做到了!非常感謝! – 2012-02-16 07:14:12

+0

似乎BindProperty從未運行,當我嘗試。 – 2014-07-23 18:41:10