【问题标题】:Using CascadeMode.StopOnFirstFailure on a validator level在验证器级别使用 CascadeMode.StopOnFirstFailure
【发布时间】:2014-01-20 19:47:14
【问题描述】:

从 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,但事实并非如此。无论以前的验证错误如何,所有规则都在评估中。

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

【问题讨论】:

  • 同意,这种行为确实不是预期或理想的,因为每个链都可以验证同一字段的不同方面,使用不同的错误消息和状态注入,这意味着您通常需要有多个规则单个字段。当您不希望触发最后一条规则时,它会变得特别烦人,因为它是检查数据库的昂贵调用,当前一条规则确定该字段为空白时,这毫无意义!

标签: validation fluentvalidation


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    ValidatorOptions.CascadeMode = CascadeMode.StopOnFirstFailure;
    

    或在属性级别通过

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

    【讨论】:

    • 是的,两者都会导致完全相同的行为。我会期待别的东西。
    【解决方案3】:

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

    .AddFluentValidation(fv =>
                {
                    fv.RunDefaultMvcValidationAfterFluentValidationExecutes = true;
                    fv.ValidatorOptions.CascadeMode = CascadeMode.Stop;
    
                    fv.RegisterValidatorsFromAssemblyContaining<Startup>();
                });
    

    【讨论】:

      猜你喜欢
      • 2022-08-23
      • 1970-01-01
      • 2013-03-19
      • 2012-06-23
      • 2016-02-22
      • 1970-01-01
      • 2015-11-30
      • 2018-03-13
      相关资源
      最近更新 更多