2015-03-31 24 views
4

我試圖驗證三個字段中只有一個具有使用FluentValidation的值。使用FluentValidation驗證互斥字段

RuleFor(x => x.Date1) 
      .Must(x => !x.HasValue) 
      .When(x => x.Date2.HasValue || x.Date3.HasValue) 
      .WithMessage("Select only one of Date 1, Date 2 and Date 3"); 

這對其他2個日期重複。如預期的那樣,這產生了每個匹配規則的消息。

還有其他的規則,所以有沒有辦法執行其他規則,但在這三個中的第一個失敗?我已經看到了我可以在哪裏設置CascadeMode.StopOnFirstFailure全球範圍內,但我希望這三者之外的其他規則像目前一樣工作。

+1

三者有機結合的規則在單一.Custom(...)規則。 – Maarten 2015-03-31 19:17:58

回答

5

我決定走下另一條路線。它感覺優雅,但我會知道它是否通過代碼審查。

我創建了一個新的屬性

public IEnumerable<DateTime?> MutuallyExclusiveDates 
    { 
     get 
     { 
      return new List<DateTime?>() 
      { 
       Date1, 
       Date2, 
       Date3 
      }; 

     } 
    } 

然後我說這個規則

RuleFor(x => x.MutuallyExclusiveDates) 
      .Must(x => x.Count(d => d.HasValue) <= 1) 
      .WithMessage("Select only one of Date 1, Date 2 and Date 3"); 
+0

難道你不能用lambda返回包含三個日期的列表來替換選擇RuleFor(...)調用中的屬性值的lambda?然後你可以刪除額外的屬性。 – Maarten 2015-03-31 21:52:43

+0

昨天是我第一次使用FluentValidation的經驗,所以在嘗試了一些失敗的方法之後,這一個工作。我喜歡這個模型可以很容易地更新所涉及的日期。 – recursionjm 2015-04-01 12:19:13