Валидация диалогов - QualitySolution/QSProjects GitHub Wiki
В целом проверка корректности ввода пользователем данных проходит с помощью стандартного валидатора от MS Validator из библиотеки System.ComponentModel.DataAnnotations. Но у нас как всегда имеется собственная обвязка для более простой интеграции в экосистему.
IValidator
Это главный внутренний интерфейс для валидации, он должен быть передан в любую ViewModel которая перед сохранением должна проверить корректность ввода данных пользователем. Не забывайте прописывать ее в конструктор!
Имеется набор тестов https://github.com/QualitySolution/QSProjects/blob/0bdb4ee46c0d9ff3877f6b7029042afba88858cd/QS.Testing/ViewModels/EntityViewModelsTestsBase.cs#L31 который проверяет все ViewModel и сущностей в проекте, отлавливая ситуации когда в доменной модели сущности используется интерфейс IValidatableObject или добавлен один из атрибутов ValidationAttribute, при этом в конструктор ViewModel не передан IValidator.
ViewModels
ViewModel-и начиная с UowDialogViewModelBase и выше по иерархии при вызове метода Save() вызывают так же механизм валидации. Который выполняет проверку всех объектов добавленных в коллекцию Validations этой ViewModel-и. Если какой либо объект не прошел проверки, сохранение останавливается, а пользователю выводится диалог с результатами проверки.
Базовый класс EntityDialogViewModelBase автоматически добавляет в коллекцию проверок, сущность находящуюся в Entity, то есть для проверки объекта редактирования в диалоге ничего дополнительно делать не надо. Если в диалоге необходимо проверять еще какие либо объекты их необходимо добавить в коллекцию Validations ViewModel-и в ручную.
Передача параметров валидации
Иногда в метод валидации необходимо передать какие-то классы или дополнительные параметры. Это можно сделать перезаписав список валидации:
Validations.Clear();
Validations.Add(new ValidationRequest(Entity, new ValidationContext(Entity, new Dictionary<object, object> { { nameof(BaseParameters), baseParameters } })));
В самом методе валидации получить переданное значение так:
var baseParameters = (BaseParameters)validationContext.Items[nameof(BaseParameters)];