Главная » Silverlight » Аннотирование данных

0

Теперь, когда вы знакомы с отображением ошибок в формах, можно приступить к рассмотрению дополнительного средства, облегчающего реализацию правил проверки данных. Встроенная в Silverlight система проверки реагирует на необработанные ис­ключения, генерируемые при попытке установить свойство. Для реализации пользова­тельской системы проверки разработчик вынужден писать код процедуры установки свойства, проверяющий новое значение и генерирующий исключение. Коды проверки часто повторяются, поэтому их тяжело сопровождать и отлаживать. При необходимости проверки нескольких условий код разрастается и становится невообразимым месивом, порождая новые ошибки, при этом ошибки, за которыми "идет охота", легко пропустить.

Платформа Silverlight предоставляет решение данной проблемы на основе аннотиро­вания данных, позволяющего применить правила проверки путем подключения одного или нескольких атрибутов к свойствам класса данных. При правильной реализации ан­нотирование данных позволяет удалить правила проверки из кода и ввести их в мета­данные. Благодаря этому код становится более понятным, а классы легче сопровождать.

Примечание. Система аннотирования данных первоначально была разработана для ASP.NET Dynamic Data, откуда она была заимствована в Silverlight. Фактически вы уже видели ее в предыдущем разделе при рассмотрении свойств

Dislpay И Required.

Генерация ошибок аннотирования

Для применения средств аннотирования данных нужно добавить в проект ссылку на сборку System. ComponentModel. DataAnnotations. dll. Она уже использовалась в преды­дущем разделе для доступа к атрибутам Display и Required. Все классы аннотирования данных находятся в пространстве имен System.ComponentModel .DataAnnotations.

реализуется на основе небольшого набора атрибутов, при­меняемых к определению свойства в классе данных. Ниже приведен пример использо­вания атрибута StringLength для проверки, не превышает ли длина поля ModelName 25 символов.

[StringLength(25)]

[Display(Name = "Название модели", Description = "Название продукта в розничной торговле.")]

public string ModelName

{

get { return modelName; }

set

{

modelName = value;

OnPropertyChanged(new

PropertyChangedEventArgs("ModelName"));

}

}

На первый взгляд все выглядит прекрасно: правило проверки ясно видно, его легко изолировать и оно полностью отделено от кода процедуры установки свойства. Однако для встроенной в Silverlight системы связывания данных этого недостаточно. Даже при аннотировании для всех стандартных элементов Silverlight необходимы исключения, чтобы можно было обнаружить присутствие неправильных данных.

К счастью, существует легкий и удобный способ генерации необходимых исклю­чений. Способ основан на использовании класса Validator, который предоставля­ет несколько статических методов, тестирующих аннотирование и свойства. Метод ValidateProperty () генерирует исключение, когда значение заданного свойства неправильное. Метод ValidateObject () проверяет весь объект и генерирует ис­ключение, когда любое свойство неправильное. Методы TryValidateProperty () и TryValidateObject () решают аналогичные задачи, но, кроме этого, они предоставляют объект ValidationResult, содержащий описание потенциальной проблемы.

В приведенном ниже примере свойство проверяется с помощью метода Validate­Property (). При его вызове код анализирует все атрибуты проверки, подключенные к свойству, и генерирует исключение ValidationException при обнаружении ошибки.

[StringLength (25)]

[Display(Name = "Model Name",

Description = "Это название продукта в розничной торговле.")] public string ModelName ?і

get { return modelName; }

set {

// Явная генерация исключения, когда атрибут // аннотации обнаружил ошибку ValidationContext context =

new ValidationContext(this, null, null); context.MemberName = "ModelNumber"; Validator.ValidateProperty(value, context);

modelName = value; OnPropertyChanged(new PropertyChangedEventArgs("ModelName"));

)

}

Добавление аналогичного кода во все процедуры установки свойств задает приме­нение правил проверки, размещенных в атрибутах, и подключение правил к системе связывания данных, встроенной в Silverlight.

Примечание. — мощный инструмент, но применять его рекомендуется не во всех случаях, потому что для индикации ошибок классы данных все же должны генерировать исключения. Такая модель не всегда уместна. Например, проблемы возникают, если объект временно должен находиться в неправильном состоянии или нужно наложить ограничения только на редактирование данных пользователем, но не на их программное изменение. Кроме того, указанная модель опасна, потому что изменение объекта данных в коде может привести к неожиданным исключениям, нарушающим работу приложения. Чтобы устранить эту проблему, можно создать в классе данных свойство Allowinvalid, которое при значении true приказывает классу обойти код проверки. Но все же это неуклюжее решение. Многие разработчики хотели бы, чтобы Silverlight предоставляла интерфейс iDataError, доступный в WniForms и WPF, но в Silverlight его пока что нет.

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии