Fluent 验证在第一次失败后停止

Fluent validation stop after first failure

我已经知道(就像在另一个问题 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。基本上是因为我正在验证页面中的输入字段,我更喜欢一个一个地显示错误。

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

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

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

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

也许任何人都和我一样怀疑使用 CascadeMode.StopOnFirstFailure,如果你使用像 not null 或 not empty 这样的方法,并且你的字段没有值,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 ...")