使用一条消息验证多个属性
Validate multiple properties with one message
我正在尝试验证具有三个必需属性的 class。
如果其中一个或多个为空,它应该触发一条验证消息。
在流利的验证器中是否有一种惯用的方式来描述它?
我正在查看 dependant rules,但文档页面底部建议不要使用它们。
此外,我仍然想验证所有三个属性。我只是不想重复消息。
我注意到 RuleSets,但这些似乎有不同的用途。
或者,我可以专门为这三个选项创建一个没有消息的验证器,然后将新验证器链接到原始验证器中。那我想我可以给那个人一个消息。
但对于一个围绕可读性构建的系统来说,这是很多仪式。
因此寻找一种可读的方式来表达对三个字段的验证,结果是一条消息。
您可以通过 3 种主要方式使用 FluentValidation 执行此操作:条件、相关规则或自定义规则。
条件
您可以在 When
条件下使用 3 个单独的规则声明,以确保您只会收到一条验证消息。
RuleFor(x => x.Property1).NotNull()
.WithMessage("At least one is required");
RuleFor(x => x.Property2).NotNull()
.When(x => x.Property2 != 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");
这种方法略有不同,因为它创建了一个 model-level 规则,因此错误消息将与整个模型相关联,而不是与特定的 属性.
通过设置 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();
}
}
我正在尝试验证具有三个必需属性的 class。
如果其中一个或多个为空,它应该触发一条验证消息。
在流利的验证器中是否有一种惯用的方式来描述它?
我正在查看 dependant rules,但文档页面底部建议不要使用它们。
此外,我仍然想验证所有三个属性。我只是不想重复消息。
我注意到 RuleSets,但这些似乎有不同的用途。
或者,我可以专门为这三个选项创建一个没有消息的验证器,然后将新验证器链接到原始验证器中。那我想我可以给那个人一个消息。
但对于一个围绕可读性构建的系统来说,这是很多仪式。
因此寻找一种可读的方式来表达对三个字段的验证,结果是一条消息。
您可以通过 3 种主要方式使用 FluentValidation 执行此操作:条件、相关规则或自定义规则。
条件
您可以在 When
条件下使用 3 个单独的规则声明,以确保您只会收到一条验证消息。
RuleFor(x => x.Property1).NotNull()
.WithMessage("At least one is required");
RuleFor(x => x.Property2).NotNull()
.When(x => x.Property2 != 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");
这种方法略有不同,因为它创建了一个 model-level 规则,因此错误消息将与整个模型相关联,而不是与特定的 属性.
通过设置 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();
}
}