Модели в ASP.NET Core MVC. Самовалидация модели

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

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии