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 ...")
我已经知道(就像在另一个问题 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 ...")