3

我有一个继承自 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 中的 Bar 属性不能为空,并且我使用 FluentValidation 的规则说,在我调用 base.BindModel 后 ModelState 将无效。

因此,我想避免在调用 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

1 回答 1

4

Instead of overriding the BindModel method you could try overriding the BindProperty method:

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);
    }
}
于 2012-02-15T20:45:09.883 回答