我正在尝试验证具有三个必需属性的类。
如果其中一个或多个为空,它应该触发一条验证消息。
在流利的验证器中是否有一种惯用的方式来描述它?
我正在查看依赖规则,但文档页面的底部建议不要使用它们。
此外,我仍然想验证所有三个属性。我只是不想重复消息。
我注意到RuleSets,但这些似乎有不同的用途。
或者我可以专门为这三个选项创建一个验证器但没有消息,然后将新验证器链接到原始验证器中。然后我想我可以给那个人一个信息。
但对于一个围绕可读性构建的系统来说,这是很多仪式。
所以寻找一种可读的方式来表达对三个字段的验证,结果是一条消息。
使用 FluentValidation 可以通过 3 种主要方式执行此操作:条件、依赖规则或自定义规则。
您可以使用 3 个带有
When
条件的单独规则声明来确保您只会收到一条验证消息。
RuleFor(x => x.Property1).NotNull()
.WithMessage("At least one is required");
RuleFor(x => x.Property2).NotNull()
.When(x => x.Property1 != null)
.WithMessage("At least one is required");
RuleFor(x => x.Property3).NotNull()
.When(x => x.Property1 != null && x.Property2 != null)
.WithMessage("At least one is required");
RuleFor(x => x.Property1).NotNull()
.WithMessage("At least one is required")
.DependentRules(() => {
RuleFor(x => x.Property2).NotNull()
.WithMessage("At least one is required")
.DependentRules(() => {
RuleFor(x => x.Property3).NotNull().WithMessage("At least one is required");
});
});
我不是特别喜欢这种方法——我认为它很难阅读(因此文档中有警告),但如果你喜欢这种方法,它会工作得很好。
RuleFor(x => x)
.Must(x => x.Property1 != null && x.Property2 != null && x.Property3 != null)
.WithMessage("At least one is required");
这种方法略有不同,因为它创建了模型级规则,因此错误消息将与整个模型相关联,而不是与特定属性相关联。
通过设置
CascadeMode
属性在第一条规则失败时停止验证器:
public class MyClassValidator : AbstractValidator<MyClass>
{
public DestinationDeviceValidator()
{
this.CascadeMode = CascadeMode.Stop;
this.RuleFor(x => x.Property1)
.NotNull();
this.RuleFor(x => x.Property2)
.NotNull();
this.RuleFor(x => x.Property3)
.NotNull();
}
}