您有两个选项可以在单个命令中执行此操作,但它们都有点棘手,因为您需要在验证包含类不为空的同时验证内部属性。它们都围绕Cascade
属性(请参阅“设置级联模式”)以停止对第一个错误的验证。
首先,您可以使用Must
来进行验证。您需要WithMessage
像我所做的那样指定 a 以避免获得通用的“'竞争对手产品'的指定条件不满足。” 错误。您可能还想覆盖WithErrorCode
默认为Predicate
. 请注意,这只会显示在第二个验证错误上;第一个错误仍将正确返回属性不能为空的消息。
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);
}
}