Краткий обзор валидации в ASP.NET 3.5
Во многих приложениях вы можете использовать проверку на правильность формата информации, проверить, находятся ли значения в пределах заданного диапазона или имеют ли вообще поля какие-то значения. Например, если вы обрабатываете заказ, вы наверняка должны убедиться, что пользователь ввел адрес и номер телефона, что номер телефона состоит из определенного количества цифр (и не содержит букв), и что введенный номер социальной защиты состоит из девяти цифр, разделенных дефисами. Некоторые приложения требуют наличия более сложной валидации, с помощью которой вы проверяете, насколько значение одного поля попадает в диапазон, установленный двумя другими полями. Например, в одном поле вы можете попросить ввести дату прибытия клиента в ваш отель, а в другом поле - попросить ввести дату выезда. Когда пользователь бронирует место на ужин, вы, скорее всего, захотите удостовериться, что он выбрал дату в пределах дат прибытия и выезда.
Не существует предела уровню сложности необходимой вам операции проверки данных. Кредитные карточки обладают контрольной суммой их значений, также как и номера ISBN. Zip и другие почтовые коды должны соответствовать сложным образцам, так же, как и интернациональные номера телефонов. Вам наверняка придется проверять пароли, номер членства, количество долларов, даты, выбор взлетно-посадочной полосы или коды запуска.
Вдобавок вам, скорее всего, необходимо, чтобы эти проверки происходили на клиентской части, чтобы избежать задержки повторных обращений к серверу (postbacks), пока пользователь исправляет введенную информацию. (В прошлом, это было решено написанием кода по проверке введенных данных на JavaScript для клиентской части, а затем написание скрипта для сервера по обработке информации приходящей от тех браузеров, которые не поддерживают клиентские приложения). Раньше это осуществлялось при помощи написания кода на JavaScript для клиентской части по проверке введенных данных, а позднее - написанием скрипта для сервера по обработке информации, поступающей от тех браузеров, которые не поддерживают клиентские приложения. В дополнение, в качестве проверки безопасности, вы наверняка хотели бы осуществить проверку со стороны сервера, притом, что у вас имеется проверка, реализованная в браузере, так как пользователи могут обойти клиентский код проверки посредством создания вредоносной страницы, которая маскируется под оригинальную страницу (такая тактика также известна под названием спуфинг). Обычно такие меры защиты подразумевают двойное написание кода проверки: один код - для клиента, другой код - для сервера.
Вы можете заметить, что в традиционном веб-программировании валидация требует создания специального программного кода. ASP.NET Framework упрощает этот процесс путем обеспечения функциональных элементов управления для валидации пользовательского ввода. В дополнение к проверке истинности введенной информации, элементы управления, осуществляющие проверку, позволяют вам указать, как и где будут выведены сообщения об ошибке: либо встроенные в элементы управления, отвечающие за ввод, либо отчетный доклад, либо оба одновременно. Вы можете использовать эти элементы управления для проверки ввода для HTML и серверных элементов управления ASP.NET.
Элементы управления, осуществляющие валидацию
Вы добавляете валидационные элементы управления в ваш ASP.NET документ так же, как и все остальные элементы управления. В качестве свойства этих элементов управления вы можете указать те элементы, которые вы проверяете. У вас есть возможность комбинировать различные валидационные элементы управления, а также вы можете написать свои собственные валидационные элементы управления. Наличие современных браузеров, которые поддерживают DHTML, позволяет производить валидацию .NET с клиентской стороны, тем самым, избегая обхода через сервер (такая клиентская валидация использует JavaScript, но она не является частью библиотеки AJAX.) При работе со старыми браузерами ваш код останется неизмененным, но код, высланный клиентской стороне, обеспечивает валидацию на сервере. Валидация происходит тогда, когда страница пытается связаться с сервером. Иногда вы не хотите производить никакой валидации, например, когда была нажата кнопка «Отмена». Чтобы предотвратить валидацию при таких условиях, многие элементы управления — такие как Button, ImageButton, LinkButton, ListControl, и TextBox— , осуществляющие postback (механизм появившийся в Microsoft ASP.NET, который позволяет осуществлять связь между клиентской стороной и серверной), имеют свойство CausesValidation, которое вы можете настроить таким образом, что оно будет разрешать выполнение валидации на странице, когда выполняется событие элемента управления, используемое по умолчанию.
Если CausesValidation имеет значение «Истина», значение по умолчанию — postback— не произойдет, если какой-либо элемент управления на странице не прошел валидацию. Это очень важно, так как означает, что страница не отправит данные на сервер, пока все элементы управления на странице не будут соответствовать условиям валидности. Если же CausesValidation имеет значение «Ложь», то валидация не будет произведена при использовании кнопка для посылки данных со страницы.
Иногда вам будет необходимо разрешить postback, даже если какие-то элементы управления на странице являются неработоспособными. Допустим, у вас есть страница, которая собирает данные об адресе, а также информацию о налогах. Кнопка на странице обрабатывает поля, относящиеся к адресу, что может быть выполнено до того, как пользователь введет какую-либо информацию о налогах. Как бы то ни было, если требуемая информация о налогах отсутствует в поле, страница не отошлет данные. Ваша проблема может быть решена при помощи ValidationGroup. Вы можете сгруппировать несколько элементов управления с тем элементом (элементами) управления, которые вызывают postback, таким образом будут применены только те элементы управления, которые являются членами этой группы. В данном примере вы может понадобиться выполнение условия валидности для элементов управления, отвечающих за адрес, до того как разрешить кнопке Address выполнить отсылку данных, но разрешить отсылку даже в случае отсутствия информации в некоторых полях с информацией о налогах.
ASP.NET включает в себя следующие валидационные элементы управления:
RequiredFieldValidator
Обеспечивает проверку на случаи, когда пользователь не заполняет поле, тем самым пропуская ваш элемент управления. RequiredFieldValidator может быть связан с текстовым полем – это означает, что страница пройдет валидацию, если пользователь введет что-нибудь в это текстовое поле. Что касается элементов управления по выборке, такие как выпадающий список или кнопки с зависимой фиксацией (radio button), то RequiredFieldValidator осуществляет проверку того, чтобы пользователь выбрал значение, отличное от значения по умолчанию, указанного вами. RequiredFieldValidator не проверяет валидность данных; оно только осуществляет проверку случая ввода либо выбора информации.
RangeValidator
Обеспечивает соблюдение условия ввода значений в соответствии с нижним и верхним пределами. Вы можете указать такой диапазон, который будет ограничен двумя значениями (такими, как больше 10 и меньше 100), двумя символами (больше, чем D и меньше, чем K), либо двумя датами (после 1/1/08 либо до 2/28/08).
CompareValidator
Сравнивает значение, введенное пользователем, с другим каким-либо значением. Оно может осуществлять сравнение с какой-либо константой, заданной во время разработки, или с каким-либо значением свойства другого элемента управления. Оно также может сравнивать со значениями из базы данных.
RegularExpressionValidator
Один из самых мощных валидаторов, он сравнивает пользовательский ввод с установленным вами регулярным выражением. Регулярные выражения являются эффективным способом сравнения информации с образцом букв, чисел или символов. Вы можете использовать этот валидатор для проверки валидности кода социальной защиты, телефонных номеров, длин паролей и так далее.
CustomValidator
Если ни один из вышеперечисленных элементов управления не удовлетворяет ваших нужд, вы можете создать ваш собственный, используя CustomValidator. Он осуществляет проверку пользовательского ввода с любым алгоритмом, заданным вами в специальном методе.