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

ответ

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

Не можете ли вы заменить лямбда, выбирая значение свойства в вызове RuleFor (...), когда лямбда возвращает список, содержащий три даты? Затем вы можете удалить дополнительное свойство. – Maarten

+0

Вчера был мой первый опыт использования FluentValidation, поэтому, попробовав несколько неудачных методов, этот работал. Мне нравится, что модель может быть легко обновлена ​​с учетом сроков. – recursionjm

1

Я хотел бы использовать что-то вроде

RuleFor(x => x).Must(ValidateDates).WithName("something"); 

<snip/> 

private bool ValidateDates(SomeRequest request) 
{ 
    //perform logic and return true/false; 
} 

Внутри метода ValidateDates вы имеете доступ к полной запрос.

Дополнительные примеры комплексной проверки с использованием Must взглянуть на этот пост - http://nodogmablog.bryanhogan.net/2015/04/complex-model-validation-using-fluent-validation/