从FluentValidation documentation我了解到我可以通过设置级联模式来中止验证。
RuleFor(x => x.Surname)
.Cascade(CascadeMode.StopOnFirstFailure)
.NotNull()
.NotEqual("foo");
这样,如果属性 Surname 为null,则不会执行相等性检查,并且会阻止空指针异常。在文档中进一步说明,这也不仅适用于规则,也适用于验证器级别。
public class PersonValidator : AbstractValidator<Person> {
public PersonValidator() {
// First set the cascade mode
CascadeMode = CascadeMode.StopOnFirstFailure;
// Rule definitions follow
RuleFor(...)
RuleFor(...)
}
}
我将CascadeMode设置为不在规则定义中,而是设置为验证器的实例。预期的行为是,如果第一个RuleFor
失败,则不会评估第二个RuleFor
,但情况并非如此。无论先前的验证错误如何,都在评估所有规则。
我错误地使用它还是误解了文档?
答案 0 :(得分:11)
根据JeremyS'answer,我误解了CascadeMode
的目的。事实上,它并不打算对验证程序级别产生影响,而只是在规则范围内。
答案 1 :(得分:5)
您可以通过设置
在全局级别设置CascadeModeValidatorOptions.CascadeMode = CascadeMode.StopOnFirstFailure;
或在物业层面
RuleFor(x => x.PropertyName)
.Cascade(CascadeMode.StopOnFirstFailure)
答案 2 :(得分:0)
如果您使用的是 .NET Core,您可以在全局级别设置级联模式,如下所示
.AddFluentValidation(fv =>
{
fv.RunDefaultMvcValidationAfterFluentValidationExecutes = true;
fv.ValidatorOptions.CascadeMode = CascadeMode.Stop;
fv.RegisterValidatorsFromAssemblyContaining<Startup>();
});