2015-06-11 4 views
2

В этой сущности:FluentValidation - Как настроить сообщение проверки во время выполнения

public class Foo 
{ 
    public Guid Id { get; set; } 
    public string Type { get; set; } 
    public string Name { get; set; } 
} 

Как я могу настроить сообщение проверки во время выполнения, используя другое свойство объекта или любую другую строку, полученную из базы данных?

сообщение проверки для RuleFor(foo => foo.Name) будет:

var msg = "The foo with type '" + foo.Type + "' already exists in the database with name '" + nameInDataBase + "'!" 
+0

См. Https://github.com/JeremySkinner/FluentValidation/wiki/d.-Configuring-a-Validator –

ответ

0

Как я был сложный сценарий, решение, что решена моя проблема была найдена здесь: Custom Validators.

Вот код валидатор:

public class FooValidator : AbstractValidator<Foo> 
{ 
    public FooValidator() 
    { 
     Custom(foo => 
     { 
      var repo = new Repository<Foo>(); 
      var otherFooFromDB = repo.GetByName(foo.Name); 

      if (!otherFooFromDB.Equals(foo)) 
      { 
       return new ValidationFailure("Id", "The foo with ID'" + otherFooFromDB.Id + "' has the same name of this new item '" + foo.Id + " - " + foo.Name + "'.!"); 
      } 
      else 
      { 
       return null; 
      } 
     }); 
    } 
} 

С помощью этого решения, когда проверка в порядке просто вернуть null. Но когда есть ошибка проверки, верните экземпляр ValidationFailure и передайте в свой конструктор имя проверяемого свойства и сообщение проверки.

+1

Я бы сделал одно изменение выше, и это должно было ввести ваше репо в валидатор, иначе вы будете испытывать его боль. –

+0

Да @YannickMeeus !! ... Я использую 'Интерфейс' для моих РЕПО, чтобы сделать возможное тестирование ... с помощью mocks. –

0

Создать пару пользовательских валидаторов, и определить их как методы расширения, так что вы можете приковать их. Передайте то, что вам нужно сделать для проверки в модели. Тогда, если у вас есть foo.Type как свойство вашей модели, вы можете отобразить его в сообщении, как показано ниже:

RuleFor(foo => foo.Name).FooTypeIsInvalidValidator().WithMessage("The foo with type: {0} is invalid!", foo => foo.Type); 

или

RuleFor(foo => foo.Name).FooAlreadyExistsValidator().WithMessage("The foo with type: {0} already exists in the database with name", foo => foo.Type); 
+0

Спасибо KN Coder (@ kn-coder), но мой сценарий сложнее. Я отправляю новый ответ. –