задача:
есть такое окно добавления данных(фамилия и имя не должны быть пустыми, возраст - число в адекватном диапазоне, обязательно должен быть выбран пол)
необходимо при нажатии на ОК вывести информацию о всех ошибках, которые допустил пользователь.
интересует следующее (да, я знаю что 1 вопрос - 1 тема):
производить валидацию в модели или в представлении?
если в модели - то каким образом выводить информацию об ошибках?
можно ли в модели использовать MessageBox?
если в представлении - не нарушает ли это логику паттерна?
когда нужно использовать IDataErrorInfo и валидацию, а когда обойтись get;set;
UPD
проект
ссылка на github
колхоз находится в 2 файлах:
1) тут я не придумал ничего лучше чем впихнуть проверку данных в самой модели
2) в этом представлении у меня так же через цензуру происходит вывод сообщения об ошибке
Как вариант исправления всего этого я вижу 1 способ: для StudentWindow создать отдельную модель, но чет я представить не могу что в ней писать.
Ответ
В модели представления (она же VM). Валидация вводимых данных — типичная задача мелкой бизнес-логики.
Есть много способов. Лучше всего, вероятно, асинхронный интерфейс INotifyDataErrorInfo. (Вот ответ по теме: https://stackoverflow.com/a/9950236/276994.)
Строго говоря — нет. VM вообще не должна знать, выводятся ошибки в MessageBox, в строку состояния, Popup возле элемента с ошибкой или куда-нибудь ещё, это дело View. Правильная организация вывода ошибок — сложная тема. Умеренно простой вариант решения — здесь (сервис открытия произвольных окон). Более правильное идеологически решение было бы иметь глобальный сервис отображения ошибок, для которого View предоставляет свою имплементацию.
Это довольно сложная тема, включающая в себя в общем случае решение вопросов
Должны ли сообщения об ошибках автоматически исчезать через некоторое время?
Как юзер может убрать сообщение об ошибке?
Что если у нас одновременно несколько сообщений?
Нужны ли приоритеты по важности?
Что делать с повторяющимися сообщениями об ошибке (например, программа долбится в файл, защищённый от записи, и каждую секунду производит одно и то же сообщение об ошибке)
и т. д.
На практике, однако, (слишком) часто не заморачиваются, и пишут в VM код наподобие
catch (Exception e) // ужасно
{
MessageBox.Show("Error!", e.Message); // ещё ужаснее
}
Постарайтесь так не делать, знайте, что юзерам это не понравится.
Логика паттерна такова: за то, когда возникает ошибка и какова она, отвечает VM. За то, где и каким образом показывать её, отвечает View. Таким образом, логика паттерна не нарушена.
Это вопрос к архитектору вашего приложения, на него нету однозначного ответа. У меня в проекте, например, валидация может занимать длительное время, поэтому я не пользуюсь ни тем и ни другим, а предпочитаю третий вариант — INotifyDataErrorInfo. (Он позволяет асинхронную валидацию, а также кросс-валидацию: ошибка может быть не в значении одного свойства, а в недопустимой комбинации значений нескольких свойств!)
Комментариев нет:
Отправить комментарий