在第一次失败后,流畅验证停止

本文关键字:验证 第一次 失败 | 更新日期: 2023-09-27 18:17:24

我已经知道(就像在使用CascadeMode的另一个问题中很好地解释的那样)。StopOnFirstFailure(在验证器级别),表明Fluent验证的级联模型只在规则级别工作,而不是在验证器级别。

我有一个这样的任务:

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

如果在第一个规则中有错误,我不想验证第二个规则。主要是因为我正在验证页面中的输入字段,我更喜欢一个一个地显示错误。

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

所以我想理解的是:是否有一种方法可以在第一个验证规则没有失败的情况下启动第二个验证规则?或者也许我没有正确使用流畅验证,即使我从同一页面检索所有参数,我也必须将它们分开并使用两个(或更多,基于概念的数量)不同的验证器?

在第一次失败后,流畅验证停止

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

也许任何人都有同样的疑虑使用CascadeMode。StopOnFirstFailure,如果你使用的方法不空或不空,你的字段没有值,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 ...")

您可以使用私有局部变量添加。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)
        ...
});

对于任何看到这篇文章的人,你现在可以使用

ClassLevelCascadeMode = CascadeMode.Stop;
//or
RuleLevelCascadeMode = CascadeMode.Stop;

类级别在第一次失败后停止所有验证。

RuleFor(x => x.AValue)
    .NotNull()
    .WithMessage("Null-error message.")
    .WithErrorCode("400");
RuleFor(x => x.AValue)
    .NotEmpty()
    .WithMessage("Empty-error message.")
    .WithErrorCode("400");

如果value为NULL,只输出:

    <
  1. Null-error消息/gh>

Rule-level在第一次失败后停止所有链接规则,对于与Class-level相同的示例,将输出:

    <
  1. Null-error消息/gh><
  2. Empty-error消息/gh>

如果它们像这样链接在一起:

RuleFor(x => x.AValue)
    .NotNull()
    .WithMessage("Null-error message.")
    .WithErrorCode("400")
    .NotEmpty()
    .WithMessage("Empty-error message.")
    .WithErrorCode("400");

将输出

    <
  1. Null-error消息/gh>