2013-10-07 127 views
4
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是假,則CompetitorProducts不爲空,並且具有至少一種元素。有條件驗證集合

它的工作原理,但它是可能的,作爲一個規則?

回答

4

在單個命令中有兩個選項可以做到這一點,但它們都有點棘手,因爲您需要驗證內部屬性,同時驗證包含類是否爲空。它們都圍繞着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); 
     } 
    }