我有一个继承自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.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时会导致错误,所以我希望在这里发生相同的错误。
答案 0 :(得分: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);
}
}