修改后,如何在从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中的Bar属性不能为null,并且我使用FluentValidation时有一条规则,在我调用base后,ModelState将无效。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,但当我调用验证器时。验证我没有收到任何错误。我的模型上有另一个属性,当我运行base时,它确实导致了错误。BindModel之前,所以我希望这里也会发生同样的错误。

您可以尝试重写BindProperty方法,而不是重写BindModel方法:

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

相关内容

  • 没有找到相关文章

最新更新