使用Fluent验证进行条件验证


86

我需要的是一种方法,可以根据是否填写其他字段来有条件地验证字段。

例如 我有一个下拉列表和一个相关的日期字段。如果未设置任何字段,则表单应通过验证。但是,如果设置了两个字段之一,但未设置另一个字段,则将触发验证,要求设置另一个字段。

我已经编写了自定义验证类,但似乎是在单个字段上进行验证。有没有一种方法可以使用内置验证器来设置我需要的验证?如果不是,是否存在使用自定义验证器连接两个字段的好方法?

Answers:


129

流利的验证支持条件验证,只需使用When子句检查辅助字段的值即可:

https://fluentvalidation.net/start#conditions

使用When / Unless指定条件可以使用When和Never方法指定用于控制规则应在何时执行的条件。例如,仅当IsPreferredCustomer为true时,才会执行CustomerDiscount属性上的此规则:

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

除非方法与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();
});

这次,该条件将应用于两个规则。您还可以将调用链接到else,这将调用不符合条件的规则:

When(customer => customer.IsPreferred, () => {
   RuleFor(customer => customer.CustomerDiscount).GreaterThan(0);
   RuleFor(customer => customer.CreditCardNumber).NotNull();
}).Otherwise(() => {
  RuleFor(customer => customer.CustomerDiscount).Equal(0);
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.