【发布时间】:2014-01-20 19:47:14
【问题描述】:
从 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,但事实并非如此。无论以前的验证错误如何,所有规则都在评估中。
是我用错了还是我误解了文档?
【问题讨论】:
-
同意,这种行为确实不是预期或理想的,因为每个链都可以验证同一字段的不同方面,使用不同的错误消息和状态注入,这意味着您通常需要有多个规则单个字段。当您不希望触发最后一条规则时,它会变得特别烦人,因为它是检查数据库的昂贵调用,当前一条规则确定该字段为空白时,这毫无意义!
标签: validation fluentvalidation