FluentValidationを使用した条件付き検証


86

私が必要としているのは、他のフィールドが入力されているかどうかに応じて、フィールドを条件付きで検証する方法です。

例 関連するドロップダウンと日付フィールドがあります。どのフィールドも設定されていない場合、フォームは検証に合格する必要があります。ただし、2つのフィールドの一方が設定されていて、もう一方が設定されていない場合は、検証が実行され、もう一方のフィールドを設定する必要があります。

カスタム検証クラスを作成しましたが、単一のフィールドで検証されているようです。組み込みのバリデーターを使用して必要な検証を設定する方法はありますか?そうでない場合、カスタムバリデーターを使用して2つのフィールドを接続する良い方法はありますか?

回答:


131

Fluent検証は条件付き検証をサポートします。When句を使用して、セカンダリフィールドの値を確認してください。

https://fluentvalidation.net/start#conditions

When / Unlessを使用した条件の指定WhenメソッドとUnlessメソッドを使用して、ルールをいつ実行するかを制御する条件を指定できます。たとえば、CustomerDiscountプロパティのこのルールは、IsPreferredCustomerがtrueの場合にのみ実行されます。

RuleFor(customer => customer.CustomerDiscount)
    .GreaterThan(0)
    .When(customer => customer.IsPreferredCustomer);

untilメソッドは単にWhenの反対です。

.SetValidator操作を使用して、NotEmpty条件で動作するカスタムバリデーターを定義できる場合もあります。

RuleFor(customer => customer.CustomerDiscount)
    .GreaterThan(0)
    .SetValidator(New MyCustomerDiscountValidator);

複数のルールに同じ条件を指定する必要がある場合は、ルールの最後でWhen呼び出しをチェーンする代わりに、最上位のWhenメソッドを呼び出すことができます。

When(customer => customer.IsPreferred, () => {
   RuleFor(customer => customer.CustomerDiscount).GreaterThan(0);
   RuleFor(customer => customer.CreditCardNumber).NotNull();
});

今回は、両方のルールに条件が適用されます。条件に一致しないルールを呼び出すOtherwiseへの呼び出しをチェーンすることもできます。

When(customer => customer.IsPreferred, () => {
   RuleFor(customer => customer.CustomerDiscount).GreaterThan(0);
   RuleFor(customer => customer.CreditCardNumber).NotNull();
}).Otherwise(() => {
  RuleFor(customer => customer.CustomerDiscount).Equal(0);
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.