Validation 在验证程序级别使用CascadeMode.StopOnFirstFailure
从FluentValidation中,我了解到可以通过设置级联模式中止验证Validation 在验证程序级别使用CascadeMode.StopOnFirstFailure,validation,fluentvalidation,Validation,Fluentvalidation,从FluentValidation中,我了解到可以通过设置级联模式中止验证 RuleFor(x => x.Surname) .Cascade(CascadeMode.StopOnFirstFailure) .NotNull() .NotEqual("foo"); 这样,如果属性姓氏为null,则不会执行相等性检查,并防止出现null指针异常。在文档中进一步指出,这不仅在规则中有效,而且在验证器级别也有效 public class PersonValidator : AbstractVal
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的调用,而当前一条规则确定字段为空时,这是毫无意义的!