Validation 在验证程序级别使用CascadeMode.StopOnFirstFailure

Validation 在验证程序级别使用CascadeMode.StopOnFirstFailure,validation,fluentvalidation,Validation,Fluentvalidation,从FluentValidation中,我了解到可以通过设置级联模式中止验证 RuleFor(x => x.Surname) .Cascade(CascadeMode.StopOnFirstFailure) .NotNull() .NotEqual("foo"); 这样,如果属性姓氏为null,则不会执行相等性检查,并防止出现null指针异常。在文档中进一步指出,这不仅在规则中有效,而且在验证器级别也有效 public class PersonValidator : AbstractVal

从FluentValidation中,我了解到可以通过设置级联模式中止验证

RuleFor(x => x.Surname)
.Cascade(CascadeMode.StopOnFirstFailure)
.NotNull()
.NotEqual("foo");
这样,如果属性姓氏为null,则不会执行相等性检查,并防止出现null指针异常。在文档中进一步指出,这不仅在规则中有效,而且在验证器级别也有效

public class PersonValidator : AbstractValidator<Person> {
  public PersonValidator() {

    // First set the cascade mode
    CascadeMode = CascadeMode.StopOnFirstFailure;

    // Rule definitions follow
    RuleFor(...) 
    RuleFor(...)
  }
}
公共类PersonValidator:AbstractValidator{
公共PersonValidator(){
//首先设置级联模式
CascadeMode=CascadeMode.StopOnFirstFailure;
//规则定义如下
(……)规则
(……)规则
}
}
我不是在规则定义中设置CascadeMode,而是为验证器的实例设置。预期的行为是,如果第一个
RuleFor
失败,则不会对第二个
RuleFor
进行评估,但事实并非如此。不管以前的验证错误如何,都将对所有规则进行评估


我是用错了还是误解了文档?

根据JeremyS的说法,我误解了
级联模式的目的。事实上,它并不打算对验证器级别产生影响,而只是在规则中产生影响。

您可以通过设置

ValidatorOptions.CascadeMode = CascadeMode.StopOnFirstFailure;
或在物业层面

RuleFor(x => x.PropertyName)
    .Cascade(CascadeMode.StopOnFirstFailure)

是的,两者都会导致完全相同的行为。我本以为会发生其他事情。同意,这种行为确实不是预期的或理想的,因为每个链都可以验证同一字段的不同方面,使用不同的错误消息和状态注入,这意味着您通常需要为单个字段设置多个规则。当您不想触发最后一条规则时,它会变得特别烦人,因为这是一个昂贵的检查db的调用,而当前一条规则确定字段为空时,这是毫无意义的!