Самовалидация модели — процесс, при котором модель сама запускает процесс валидации и инкапсулирует все результаты валидации. Для того, чтобы модель могла запускать процесс самовалидации, она должна реализовывать интерфейс IValidatableObject.
Реализация интерфейса IValidatableObject
Сделаем модели Person из предыдущей части самовалидирующейся:
public class Person : IValidatableObject
{
public string Name { get; set; }
public string Email { get; set; }
public int Age { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
List<ValidationResult> errors = new();
if (string.IsNullOrEmpty(Name))
errors.Add(new ValidationResult("Поле Name обязательно к заполнению", new List<string>() { "Name" }));
if ((Age <= 0)||(Age>100))
errors.Add(new ValidationResult("Возраст должен находиться в пределах от 1 до 100 лет", new List<string>() { "Age" }));
if (string.IsNullOrEmpty(Email))
errors.Add(new ValidationResult("Поле Email обязательно к заполнению", new List<string>() { "Email" }));
return errors;
}
}
Метод Validate() принимает в качестве параметра объект типа ValidationContext и возвращает коллекцию IEnumerable<ValidationResult>. В свою очередь, каждый объект ValidationResult содержит информацию об ошибке. Если в конструктор передается второй параметр, например
new ValidationResult("Поле Name обязательно к заполнению", new List<string>() { "Name" })
это означает, что ошибка валидации относится к конкретным свойствам. Если второй параметр в конструкторе не передается, то считается, что ошибка валидации относится к уровню модели.
Теперь можно запустить приложение и посмотреть на результат самовалидации модели:
Итого
Самовалидация модели позволяет проводить проверку модели непосредственно внутри класса. Для того, чтобы модель могла проводить свою валидацию самостоятельно, класс модели должен реализовывать интерфейс IValidatableObject.
