Содержание
Для валидации модели в 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
.