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

Tob*_*ias 9 validation fluentvalidation

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

RuleFor(x => x.Surname)
.Cascade(CascadeMode.StopOnFirstFailure)
.NotNull()
.NotEqual("foo");
Run Code Online (Sandbox Code Playgroud)

这样,如果属性Surname为null,则不会执行相等性检查并阻止空指针异常.在文档中进一步说明,这不仅适用于规则,也适用于验证器级别.

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

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

    // Rule definitions follow
    RuleFor(...) 
    RuleFor(...)
  }
}
Run Code Online (Sandbox Code Playgroud)

我将CascadeMode设置为不在规则定义内,而是设置为验证器的实例.预期的行为是,如果第一个RuleFor 失败,第二个RuleFor将不会被评估,但事实并非如此.无论以前的验证错误如何,都会评估所有规则.

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

Tob*_*ias 11

根据JeremyS的回答,我误解了这个目的CascadeMode.事实上,它并不打算对验证程序级别产生影响,而只是在规则内.


sre*_*ree 7

您可以通过设置在全局级别设置CascadeMode

ValidatorOptions.CascadeMode = CascadeMode.StopOnFirstFailure;
Run Code Online (Sandbox Code Playgroud)

或者在财产层面

RuleFor(x => x.PropertyName)
    .Cascade(CascadeMode.StopOnFirstFailure)
Run Code Online (Sandbox Code Playgroud)

  • 是的,两者都会产生完全相同的行为.我本来期待别的东西. (2认同)