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を実行したときにエラーが発生した別のプロパティがモデルにあるため、ここでも同じエラーが発生すると予想されます。