使用流畅验证的条件验证

本文关键字:验证 条件 | 更新日期: 2023-09-27 18:14:10

我需要的是一种有条件地验证字段的方法,这取决于是否填写了其他字段。

交货。我有一个下拉框和一个相关的日期字段。如果没有设置任何字段,则表单应该通过验证。但是,如果两个字段中的一个已设置,而另一个未设置,则应该触发验证,要求设置另一个字段。

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

使用流畅验证的条件验证

Fluent验证支持条件验证,只需使用When子句检查次要字段的值:

https://docs.fluentvalidation.net/en/latest/conditions.html

用When/Unless指定条件 When和Unless方法可用于指定控制规则何时执行的条件应该执行。例如,以下关于CustomerDiscount的规则属性将只在IsPreferredCustomer为true时执行:

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

Unless方法与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);
});