有条件地验证集合
本文关键字:集合 验证 有条件 | 更新日期: 2023-09-27 18:34:10
public class ProspectValidator : AbstractValidator<Prospect>
{
public ProspectValidator()
{
RuleFor(p => p.CompetitorProducts)
.NotNull()
.When(p => !p.ExistingCustomer);
RuleFor(p => p.CompetitorProducts.Count)
.GreaterThan(0)
.When(p => p.CompetitorProducts != null && !p.ExistingCustomer);
}
}
此验证器检查如果ExistingCustomer
为 false,则CompetitorProducts
不为 null 并且至少有一个元素。
它有效,但是否可以将其编写为一条规则?
在单个命令中执行此操作有两个选项,但它们都有点棘手,因为您需要验证内部属性,同时验证包含类是否为空。它们都围绕 Cascade
属性(请参阅"设置级联模式"(来停止对第一个错误的验证。
首先,您可以使用Must
进行验证。您需要像我所做的那样指定一个WithMessage
以避免出现通用的"'竞争对手产品'未满足指定条件"错误。您可能还希望覆盖该WithErrorCode
,因为它默认为 Predicate
。请注意,这只会在第二个验证错误时显示;第一个错误仍将正确返回属性不得为 null 的消息。
RuleFor(p => p.CompetitorProducts)
.Cascade(CascadeMode.StopOnFirstFailure)
.NotNull()
.Must(p => p.Count > 0)
.WithMessage("{PropertyName} must be greater than '0'")
.When(p => !p.ExistingCustomer);
其次,您可以为整个CompetitorProducts
类提供验证器。这将允许您让FluentValidation管理错误消息和代码。如果必须在类上进行其他验证,这将很好地工作,但如果只需要验证单个属性,则可能会矫枉过正。
public class ProspectValidator: AbstractValidator<Prospect>
{
public CurrentUserValidator()
{
RuleFor(p => p.CompetitorProducts)
.Cascade(CascadeMode.StopOnFirstFailure)
.NotNull()
.SetValidator(new CompetitorProductsValidator())
.When(p => !p.ExistingCustomer);
}
}
public class CompetitorProductsValidator : AbstractValidator<Prospect.CompetitorProducts>
{
public CompetitorProductsValidator()
{
RuleFor(p => p.Count)
.GreaterThan(0);
}
}