Самовалидация модели — процесс, при котором модель сама запускает процесс валидации и инкапсулирует все результаты валидации. Для того, чтобы модель могла запускать процесс самовалидации, она должна реализовывать интерфейс 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
.