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

时间:2014-01-20 19:47:14

标签: validation fluentvalidation

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

RuleFor(x => x.Surname)
.Cascade(CascadeMode.StopOnFirstFailure)
.NotNull()
.NotEqual("foo");

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

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

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

    // Rule definitions follow
    RuleFor(...) 
    RuleFor(...)
  }
}

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

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

3 个答案:

答案 0 :(得分:11)

根据JeremyS'answer,我误解了CascadeMode的目的。事实上,它并不打算对验证程序级别产生影响,而只是在规则范围内。

答案 1 :(得分:5)

您可以通过设置

在全局级别设置CascadeMode
ValidatorOptions.CascadeMode = CascadeMode.StopOnFirstFailure;

或在物业层面

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

答案 2 :(得分:0)

如果您使用的是 .NET Core,您可以在全局级别设置级联模式,如下所示

.AddFluentValidation(fv =>
            {
                fv.RunDefaultMvcValidationAfterFluentValidationExecutes = true;
                fv.ValidatorOptions.CascadeMode = CascadeMode.Stop;

                fv.RegisterValidatorsFromAssemblyContaining<Startup>();
            });