|
При загрузке данных из БД возникает исключение InvalidOperationException с сообщением: Элемент коллекции должен быть пустым перед использованием ItemsSource. Знаю, что для заполнения DataGrid можно использовать коллекции Items или ItemsSource, но одновременно их использовать нельзя: если задано значение для свойства ItemsSource и в коде C# добавляется элемент в Items, возникает исключение. |
Разработка многофункциональных бизнес-приложений
Валидация ввода данных
Вопросы проверки правильности введенных данных, то есть валидации рассматривались в лекциях "Базовые инструменты WPF" и "Разработка приложений на базе WPF" , в контексте привязки данных на уровне представления. Реализация такого варианта валидации осуществлялась на стороне клиента. Проверка правильности введенных данных относится к бизнес-логике приложения и его по возможности следует отделять от уровня представления данных. В корпоративных приложениях на базе сервисов WCF RIA Services имеется возможность реализации валидации на серверной стороне. Для этого используются атрибуты метаданных объектов из пространства имен System.ComponentModel.DataAnnotations. Мы уже рассматривали атрибут [ Display ] для задания представления имен свойств сущности Employee в файле метаданных EmployeeMetadata. Для валидации по умолчанию используются следующие атрибуты:
- DataTypeAttribute – определяет тип для проверяемого свойства;
- RangeAttribute – фиксирует диапазон возможных значений;
- RegularExpressionAttribute – задает регулярное выражение для строковых данных;
- RequiredAttribute – определяет обязательность свойства при вводе;
- StringLengthAttribute – задает длину строки.
Валидацию свойства FirstName сущности Employee проведем для выполнения следующих условий:
- вводимое имя может содержать только строчные и прописные буквы русского алфавита и символ пробела, для всех 20-ти возможных для ввода символов. При нарушении этого условия необходимо вывести сообщение "Недопустимые символы или более 20 символов";
- свойство FirstName является обязательным для ввода и при нарушении этого условия вывести сообщение "Поле обязательно должно быть заполнено".
Фрагмент кода класса EmployeeMetadata в части описания свойства FirstName приведен ниже.
[Display(Name = "Имя", Order = 2)]
[RegularExpression((@"^[А-Яа-я' ']{1,20}$"),
ErrorMessage = "Недопустимые символы или более 20 символов")]
[Required(ErrorMessage = "Поле обязательно должно быть заполнено")]
public string FirstName { get; set; }Аналогичные атрибуты установим в классе EmployeeMetadata для свойств LastName, SecondName и для свойства Role, за исключением атрибута [ Required ].
Для свойства Email с помощью регулярного выражения будем проверять требуемый формат для электронной почты, а сообщение об ошибке должно формироваться ссылкой на ресурс.
[Display(Name = "Эл. почта", Order = 7)]
[RegularExpression("^([\\w-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|" +
" (([\\w-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$",
ErrorMessageResourceName = "ValidationErrorInvalidEmail",
ErrorMessageResourceType = typeof(ValidationErrorResources))]
public string Email { get; set; }Для свойства Inn определим допустимость ввода только цифровых символов, которых может быть 12.
[Display(Name = "ИНН", Order = 6)]
[RegularExpression((@"^[0-9]{1,12}$"),
ErrorMessage = "Допустимы толька цифровые символы, длина ИНН - 12 символов")]
[CustomValidation(typeof(ValidaterInn), "ValidateInn")]
public string Inn { get; set; }Для свойства Inn применен атрибут CustomValidation, который позволяет задать пользовательское правило проверки. В параметрах атрибута CustomValidation определен класс ValidaterInn, определяющий правило проверки, и метод проверки – ValidateInn. Класс ValidaterInn создадим в папке Models/ Shared проекта EnterpriceBusinessApplication.Web.
public class ValidaterInn
{
public static ValidationResult ValidateInn(string Inn)
{
ValidationResult res;
if (Inn.Length == 12)
{
res = ValidationResult.Success;
}
else
{
res = new ValidationResult("ИНН должен содержать 12 символов");
}
return res;
}
}Статический метод ValidateInn возвращает экземпляр класса ValidationResult, который является контейнером результатов запроса на проверку данных. Если проверка проведена успешно, то возвращается поле ValidationResult.Success, определяющее успешное завершение проверки, в противном случае, создается новый экземпляр класса ValidationResult, которому в конструкторе передается строка, с информацией об ошибке. Класс ValidaterInn создан в проекте EnterpriceBusinessApplication.Web и для того, чтобы он был доступен на клиенте приложения его нужно сделать общедоступным, для чего необходимо переименовать файл класса, добавив к имени .shared, то есть ValidaterInn.shared.cs.
Код измененного класса EmployeeMetadata приведен в приложении.
На рис. 10.39, рис. 10.40 приведены результаты тестирования процесса валидации приложения.

