在單個命令中有兩個選項可以做到這一點,但它們都有點棘手,因爲您需要驗證內部屬性,同時驗證包含類是否爲空。它們都圍繞着Cascade
property(參見「設置級聯模式」)來停止第一個錯誤的驗證。
首先,您可以使用Must
進行驗證。您將需要指定一個WithMessage
,正如我所做的,以避免獲得通用的「競爭對手產品」沒有滿足指定的條件。「錯誤。您可能還想覆蓋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);
}
}