Валидация модели в C#. Интерфейс IValidatableObject

Для валидации модели в C# не обязательно создавать свои собственные атрибуты валидации. Разрабатываемая модель (класс) может наследовать интерфейс IValidatableObject и валидация свойств модели может проводиться внутри метода Validate. Рассмотрим пример реализации интерфейса IValidatableObject в нашем приложении.

Реализация IValidatableObject

Реализуем интерфейс IValidatableObject на примере класса пользователя с которым мы работали в самом начале.

public class User: IValidatableObject
{
    public int Age { get; set; }
    public string Name { get; set; }
    public string Password { get; set; }
    public string ConfirmPassword { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        List<ValidationResult> results = new List<ValidationResult>();
        if ((Name == null) || (Name.Trim() == ""))
            results.Add(new ValidationResult("Не определено имя пользователя"));
        if ((Age<15)||(Age>100))
            results.Add(new ValidationResult("Возраст пользователя должен быть от 15 до 100 лет"));
        if (Password != ConfirmPassword)
        {
            results.Add(new ValidationResult("Пароли не совпадают"));
        }
        return results;
    }
}

Здесь мы, фактически, заменили все атрибуты валидации на один метод — Validate интерфейса IValidatableObject . Теперь мы можем воспользоваться классом Validate и провести валидацию пользователя, например, так:

internal class Program
{
    static void Main(string[] args)
    {
        User user = new User();
        Console.WriteLine("Имя:");
        user.Name = Console.ReadLine();
        Console.WriteLine("Возраст: ");
        user.Age = Convert.ToInt32(Console.ReadLine());
        Console.WriteLine("Введите пароль: ");
        user.Password = Console.ReadLine();
        Console.WriteLine("Подтвердите пароль: ");
        user.ConfirmPassword = Console.ReadLine();

        var results = new List<ValidationResult>();
        var context = new ValidationContext(user);
        if (!Validator.TryValidateObject(user, context, results, true))
        {
            foreach (var error in results)
            {
                Console.WriteLine(error.ErrorMessage);
            }
        }

    }
}

Результат работы программы:

Имя:
Вася
Возраст:
14
Введите пароль:
1234567890
Подтвердите пароль:
0987654321
Возраст пользователя должен быть от 15 до 100 лет
Пароли не совпадают

Итого

Реализуя интерфейс IValidatableObject , мы получаем фактически возможность т.н. самовалидации модели — вся проверка соответствия полей и свойств класса осуществляется непосредственно в методе Validate.

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