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