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