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

4

1 に答える 1

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