【问题标题】:Fluent validation stop after first failureFluent 验证在第一次失败后停止
【发布时间】:2015-10-13 15:22:44
【问题描述】:

我已经知道(就像在另一个问题 Using CascadeMode.StopOnFirstFailure on a validator level 中很好解释的那样)Fluent Validation 的级联模型仅适用于规则级别,而不适用于验证器级别。

我有这样的任务:

RuleFor(x => x.Name)
    .NotNull()
    .Length(1, 128)
    .Must(ChkInput);

When(x => x.CompanyName != "..." ,() =>
{
     RuleFor(x => x)
          ...
});

如果第一个 RuleFor 出现错误,我不想验证第二个 RuleFor。基本上是因为我正在验证页面中的输入字段,并且我更喜欢一一显示错误。

我无法将第一个验证规则与第二个合并,因为有不同的概念,由同一页面获得,但不同。

所以我想了解的是: 只有当第一个规则没有失败时,才有办法启动第二个验证规则? 或者,也许我没有正确使用流利的验证,即使我从同一页面检索所有参数,我也必须将它们分开并使用两个(或更多,基于概念的数量)不同的验证器?

【问题讨论】:

    标签: c# validation fluentvalidation


    【解决方案1】:

    我遇到了类似的问题。我有两种类型的验证错误,我只想在第一组没有错误时才显示第二组错误。为了实现这一点,我将两组不同的错误分成单独的 Validation 类,并且只有在第一个类没有错误返回时才调用第二个类。

    【讨论】:

      【解决方案2】:

      也许有人和我使用 CascadeMode.StopOnFirstFailure 时一样怀疑,如果您使用非 null 或非空等方法,并且您的字段没有值,NotNull() 将计为第一个错误并在不使用我的自定义消息的情况下停止

      RuleFor(v => v.Field)
                  .NotNull().NotEmpty()
                  .WithMessage("field must have value")
                  .Must(field => condition true)
                  .WithMessage("field must ...")
      

      你可以使用 CascadeMode.StopOnFirstFailure,它可以工作,一个条件消息

      RuleFor(v => v.Field)
                  .Cascade(CascadeMode.StopOnFirstFailure)
                  .NotNull()
                  .WithMessage("field must have value")
                  .NotEmpty()
                  .WithMessage("field must have value")
                  .Must(field => true)
                  .WithMessage("field must ...")
      

      或者像这样,更好看

          RuleFor(v => v.Field)
                  .Cascade(CascadeMode.StopOnFirstFailure)
                  .Must(field => string.IsNullOrEmpty(field))
                  .WithMessage("field must have value")
                  .Must(field => true)
                  .WithMessage("field must ...")
      

      【讨论】:

        【解决方案3】:

        您可以使用私有局部变量添加 .When(ThisIsTheFirstFailure) 规则,但如果您使用单例验证器,这将不起作用

        例如

        RuleFor(x => x.Name)
            .NotNull()
            .Length(1, 128)
            .Must(ChkInput);
        
        When(x => x.CompanyName != "..." ,() =>
        {
            RuleFor(x => x.Abc)
                .When(ThisIsTheFirstFailure)
                ...
            RuleFor(x => x.Def)
                .When(ThisIsTheFirstFailure)
                ...
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-17
          • 2018-12-17
          相关资源
          最近更新 更多