2015-03-31 72 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