第一次失败后,流利的验证停止

时间:2015-10-13 15:22:45

标签: c# validation fluentvalidation

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

我有这样的任务:

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

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

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

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

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以使用私有局部变量添加.When(ThisIsTheFirstFailure)规则,但如果您使用单身验证器,则无法使用

e.g。

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)
        ...
});

答案 2 :(得分:0)

也许有人和我使用 CascadeMode.StopOnFirstFailure 有同样的疑问,如果您使用非 null 或非空等方法,并且您的字段没有值,NotNull() 将计为第一个错误并停止而不使用我的自定义消息< /p>

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 ...")