99

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

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

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

4

1 回答 1

157

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

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

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

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

除非方法与何时相反。

您还可以使用 .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);
});
于 2011-11-10T21:04:24.140 回答