Главная » Silverlight » Атрибуты аннотирования – ЧАСТЬ 1

0

Чтобы задать проверку методом аннотирования, нужно добавить атрибуты в классы данных. В этом разделе перечислены атрибуты, которые можно приме­нить для проверки. Все они наследуют класс ValidationAttribute, находятся в про­странстве имен System.ComponentModel. DataAnnotations и предоставляют свойство ValidationAttribute.ErrorMessage, содержащее текст сообщения об ошибке. Этот текст появляется во всплывающем облаке и в элементе управления ValidationSummary (если он используется).

Совет. Наложить на свойство несколько ограничений можно, добавив несколько атрибутов аннотирования подряд.

Атрибут Required

Этот атрибут задает обязательность текста в поле. Если пользователь оставит поле пустым, будет сгенерирована ошибка. Учитывайте, что атрибут Required обнаруживает пустые строки. Для числовых свойств он бесполезен, потому что значение 0 для него допустимо.

[Required О]

public string ModelNumber

{ … )

Ниже показано, как добавить текст сообщения об ошибке.

[Required(ErrorMessage="Heo6xoflMM правильный код ACME.") ]

public string ModelNumber { … }

Атрибут StringLength

Задает максимальную длину строки. Можете также (не обязательно) установить ми­нимальную длину с помощью свойства MinimumLength.

[StringLength(25, MinimumLength=5)]

public string ModelName { … }

При использовании атрибута StringLength (как и многих других атрибутов) в текст сообщения об ошибке можно добавлять следующие числовые заполнители: {0} — имя редактируемого поля, {1} — аргумент конструктора, {2} — первое свойство атрибута, {3} — второе свойство атрибута и т.д.

[StringLength(25, MinimumLength=5, ErrorMessage= "Название модели должно содержать от {2} до {1} символов.")] public string ModelName і … }

Сгенерировав ошибку, атрибут StringLength присвоит сообщению следующий Текст: Название модели должно содержать от 5 до 25 символов.

Атрибут Range

Задает диапазон допустимых значений.

[Range(0,1000)] public int UnitsInStock ( … }

Обычно этот атрибут используется с числовыми типами данных, однако его можно применить с любыми типами, реализующими интерфейс IComparable. Для этого нужно определить перегруженную версию конструктора, принимающего тип через аргумент Туре и предоставляющего значение в строковом формате.

[Range(typeof(DateTime), "1/1/2005", "1/1/2010"]

public int ExpiryDate { … }

Атрибут RegularExpression

Задает применение регулярного выражения для проверки текстового значения. Ниже приведен пример регулярного выражения, которое разрешает использование одного или многих числовых и буквенных символов (букв верхнего регистра ОТ А до Z и нижнего регистра от а до z, а также цифр от 0 до 9; остальные символы недопустимы).

Л[A-Za-zO-9]+$

Первый символ (Л) обозначает начало строки. Фрагмент в квадратных скобках опре­деляет допустимый диапазон символов. Символ + означает количество символов (один или больше, но не нулевое количество). Символ $ обозначает конец строки. Применить указанное регулярное выражение можно в аргументе атрибута.

[RegularExpression("л[A-Za-zO-9]+$")] public string ModelNumber 1. … }

В данном примере метасимволы Л, [], + и $ имеют специальное значение, опреде­ленное в языке регулярных выражений. В табл. 17.1 приведен ряд метасимволов, кото­рые можно использовать в атрибуте RegularExpression.

Таблица 17.1. Метасимволы регулярных выражений

Метасимвол

*

Правило

Нулевое или большее количество вхождений предыдущего символа или группы; например, а*Ь обозначает aab, но не а

+

Единичное или большее количество вхождений предыдущего символа или группы; например, а+ь обозначает aab, но не ь

( )

Группирование выражений и символов, интерпретируемое как один элемент; например, (ab) + обозначает ab И ababab

<т}

Повторение предыдущего символа или группы т раз; например, а {3} обозначает ааа

{т, п}

Повторение предыдущего символа или группы от т до п раз; например, а {2,3} обозначает аа или ааа, но не аааа

I

Представление одного из двух вариантов; например, а|Ь обозначает а или b

[ ]

Любой символ в данном диапазоне; например, [АА-С] обозначает А, в или с

[Л- ]

Любой символ, не совпадающий с заданным в данном диапазоне; например, [ЛА-С] обозначает любой символ, кроме А, в и С

. (точка)

Любой символ, кроме символа новой строки

\ s

Любой пробельный символ (пробел, табуляция, новая строка и т.д.)

\S

Любой символ, не являющийся пробельным

\d

Любая цифра

\D

Любой символ, не являющийся цифрой

\w

Цифра, буква или символ подчеркивания

Л

Начало строки; например, лаЬ возвратит совпадение, если символы ab находятся в начале строки

$

Конец строки; например, ab$ возвратит совпадение, если символы ab находятся в конце строки

\

Следующий символ интерпретируется как литеральный; используется для преобразования метасимволов в литеральные символы; например, \+ обозначает обычный символ +, а не метасимвол

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

Основы регулярных выражений

Все регулярные выражения состоят из символов двух типов: литеральных и метасимволов. Литеральный символ обо­значает самого себя. Метасимвол может обозначать произвольное количество других символов. Регулярные выраже­ния — мощный инструмент поиска нужных фрагментов текста благодаря набору поддерживаемых метасимволов (см. табл. 17.1).

С метасимволами л и $, обозначающими начало и конец строки, вы уже встречались в предыдущих примерах. Часто используются метасимволы \s и \d. С их помощью можно создать выражение, возвращающее строку, которая на­чинается с цифр 333, а далее содержит пробельный символ и три любые цифры. Например, приведенное ниже вы­ражение возвращает 333 333 И 333 945, НО не 334 333 ИЛИ 3334 945.

Рис. 17.4. Нарушено пользовательское правило

Атрибут CustomValidation можно также использовать для подключения прави­ла проверки на уровне класса. Это особенно полезно при необходимости сравнивать значения свойств (например, если одно свойство должно быть меньше другого). Ниже приведен метод, проверяющий, содержат ли свойства ModelNumber и ModelName разные значения.

public static ValidationResult ValidateProduct ( Product product, ValidationContext context)

if (product.ModelName = product.ModelNumber)

{

return new ValidationResult(

"Имя и номер модели не должны совпадать.");

}

else

{

return ValidationResult.Success;

}

}

Приведенный ниже атрибут CustomValidation подключает это правило к классу

Product.

[CustomValidation(typeof(ProductValidation), "ValidateProduct")]

public class Product : INotifyPropertyChanged

{ … }

Правила проверки на уровне класса обладают существенным недостатком. Как и для правил проверки свойств, для них нужно вызывать метод Validator .ValidateObject О . Однако делать это в процедуре установки свойства нельзя, потому что проверка на уровне класса должна выполняться после завершения редактирования текущего объек­та. Два мощных элемента управления данными DataGrid и DataForm позволяют решить эту проблему путем запуска метода Validator. ValidateObject () после перехода к дру­гой записи. Однако если вы не используете любой из этих элементов, пользовательские классы проверки будут для вас не очень полезными.

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

По теме:

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