2

ビューモデルで [RequiredIf] 属性を使用できるように、 Foolproof Validationを使用しています。問題は、コントローラーの外側で同じロジックを使用して、コード内で検証をトリガーしたいということです。

独自の検証コンテキストを作成し、Validatior.TryValidateObject; を使用してみました。ただし、Foolproof のカスタム RequiredIf バリデーターでは失敗します。モデルをコントローラーに渡す以外に、モデルを取得して検証する方法はありますか?

間違ったアプローチを使用していますか?

これが私のコードです:

var draftModel = _draftHelper.LoadDraft(draftId);

var validationResults = new List<ValidationResult>();

var vc = new ValidationContext(draftModel, null, null);

var isValidDraft = Validator.TryValidateObject(draftModel, vc, 
                                               validationResults, true);

そして、私が得るエラーはTryValidateObject行にあります

System.NotImplementedException: メソッドまたは操作が実装されていません。

4

2 に答える 2

3

より良いアプローチは、誰にでもできる検証ではなく、 FluentValidationを使用することだと思います。個人的には、Fluent は属性よりも優れていると思います :)。

FluentValidation を使用すると、コントローラーを使用せずにモデルを検証することもできます。

DraftVM draft = draftRepository.Get(draftId);

var DraftValidator validator = new DraftVMValidator();
ValidationResult results = validator.Validate(draft);

public class DraftVMValidator : AbstractValidator<DraftViewModel>
{
      public DraftVMValidator()
      {

         RuleFor(vm => vm.OptionalField)
            .Must(BeFilledIfNameNotEmpty)
            .WithMessage("Optional Field required because you filled out Name field");
      }


      public bool BeFilledIfNameNotEmpty(DraftVM viewModel)
      {
            return !string.IsNullOrWhiteSpace(viewModel.Name);
      }

} 

これにより、System.NotImplemented 例外が発生することはありません。

このバリデーターは、ASP.NET MVC 検証にもプラグインできるため、DRY です。
Global.asax または App_Start などで次のコードを呼び出すだけです。1 つのバリデーターを MVC モデル検証にバインドするか、通常のアプリケーションで使用します。

FluentValidationModelValidatorProvider.Configure(); // This will bind it for you

Ninject のような Inversion of Control コンテナーを使用する場合、FluentValidation にはそれと連携するプラグインもあります。上記のリンクのドキュメントでさらに入手できます。

FoolProof の代わりにこの Validator の例をもっと見たい場合は、Github にかなり大きなプロジェクトの例があります。ASP.NET MVC 4 を使用したバリデーターの例

于 2013-05-11T06:04:42.113 に答える