Опубликован: 14.11.2006 | Уровень: для всех | Доступ: платный
Лекция 5:

AutoPostBack. Привязка к данным. Коллекции. Проверка правильности вводимых данных

< Лекция 4 || Лекция 5: 123 || Лекция 6 >

Классы проверки данных (валидаторы)

Данные из форм обычно записываются в базы данных, и тип информации в них должен соответствовать типу и длине данных в полях таблиц баз данных. Кроме того, иногда нужно вводить взаимосвязанные данные, например, пароль во время регистрации нужно вводить 2 раза и он в обоих полях должен совпадать. Некоторые хакеры пытаются вводить в формы программные коды, чтобы взломать вашу систему. Бдительность и еще раз бдительность, как говорил товарищ... не помню кто. А если пользователь ввел неверные данные случайно, сервер выдаст непонятное сообщение об ошибке, и ценный клиент уйдет с нашего сайта на другой.

Прежде чем работать с данными, нужно убедиться, что:

  • в определенное поле введена информация;
  • текст в поле "Адрес" имеет форму электронного адреса (с @ и с точкой);
  • дата рождения разумна, например, пользователь не сообщил о себе, что ему 300 лет или 1 годик;
  • пароль достаточно сложен и не совпадает с логином.

Проверка может происходить и на стороне клиента, и на сервере. При валидации на стороне клиента в страницу встраивается код на Javascript. Если данные в форме не проходят проверку, страница просто не будет отправлена на сервер. Таким образом мы избежим лишнего трафика и не будем загружать сервер. С другой стороны, валидация на стороне сервера более надежна. Javascript-код хакеры могут легко посмотреть и отправить неправильные данные, которые пройдут эту проверку. Наконец, Javascript можно просто выключить в настройках браузера. При валидации на стороне сервера данные проверяются программой на полноценном языке. Ее код пользователю неизвестен. В результате проверки генерируется новая страница с сообщениями об ошибках. Самая разумная стратегия — применять комбинацию этих методов. Предварительная проверка у клиента защитит от опечаток, а серьезная проверка на сервере — от злонамеренного взлома.

Существует целый ряд серверных элементов управления, которые не занимаются выводом информации, а проверяют данные, введенные пользователем. ASP .NET 2.0 сам определяет тип браузера и генерирует наиболее подходящий для данного случая код. Если браузер поддерживает Javascript-код, который он может послать, то валидация или ее часть происходит на стороне клиента. Если браузер не поддерживает Javascript, то вся валидация происходит на сервере.

Получить доступ к валидаторам просто — раскройте в Toolbox вкладку "Validation".

Классы валидаторов образуют иерархию, во главе которой стоит абстрактный класс BaseValidator.

Базовый класс валидаторов сам наследник класса Label, так что по существу все валидаторы — метки, текст в которых становится видимым, когда не выполняются заданные нами условия проверки. По умолчанию текст в валидаторах — красный (вспомните школу и замечания учительницы в тетради). Но, конечно же, этот цвет можно поменять на более приятный. Все валидаторы имеют свойство ControlToValidate. Оно задает тот элемент управления, данные в котором проверяются данным валидатором. Этот элемент должен находиться в одном контейнере с валидатором.

Общие свойства валидаторов
Display Предоставлять ли место статически или динамически
EnableClientScript Разрешать ли генерировать клиентский код
ErrorMessage Текст сообщения об ошибке
IsValid Прошел ли валидацию связанный с валидатором элемент управления

Инициация проверки данных

Проверка всегда инициируется каким-либо событием. Обычно это щелчок на кнопках Button, ImageButton, LinkButton, в которые по умолчанию свойство CausesValidation установлено в True. Можно убрать это свойство для некоторых кнопок, которым оно не нужно, например, для кнопки Cancel.

В примере с автосалоном на странице имеются несколько валидаторов:

<asp:requiredfieldvalidator id="RequiredFieldValidator2" 
runat="server" 
	ErrorMessage="Required" 
	ControlToValidate="DropDownList1">
		</asp:requiredfieldvalidator>

Класс RequiredFieldValidator проверяет, было ли изменено значение в связанном с ним элементе управления. Если, как в данном случае, это выпадающий список — первоначально выбрано пустое значение, но требуется, чтобы пользователь выбрал конкретную марку. Если выбор не был сделан, но кнопка submit была нажата, валидация проваливается и выводится текст, заданный в ErrorMessage или в Text. Валидаторы отображают текст, указанный в свойстве "Text", всегда, когда оно не пусто, а текст, установленный в свойстве "ErrorMessage" — тогда, когда свойство "Text" равно "". Первоначальное значение задается свойством InitialValue. Если это свойство не задано, то проверка проводится на отсутствие значения (например, пустой Textbox ).

Для проверки корректности ввода электронного адреса используется класс RegularExpressionValidator:

<span class="label">Your Email</span><span 
class="label1">(Required)</span>
	<asp:textbox id="TextBox1" runat="server"></asp:textbox>
	<asp:RegularExpressionValidator 
id="RegularExpressionValidator1" runat="server" 
ControlToValidate="TextBox1" ErrorMessage="Not a valid Email" 
ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-
.]\w+)*"></asp:RegularExpressionValidator>
	<asp:RequiredFieldValidator id="RequiredFieldValidator1" 
runat="server" ControlToValidate="TextBox1" 
ErrorMessage="*"></asp:RequiredFieldValidator>
</span>

ValidationExpression — регулярное выражение, на соответствие которому проходит проверку значение текстового поля. В Visual Studio 2005 предоставляет несколько готовых шаблонов регулярных выражений, которые можно выбрать в окне свойств, — телефонных номеров разных стран, адресов, и, самое полезное, шаблоны электронной почты и адреса в Интернете.

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

Свойство Page.IsValid позволяет определить, прошла ли вся страница валидацию. Для браузеров, которые поддерживают DHTML, проверка происходит на стороне клиента. Для этого автоматически генерируется JavaScript-код. Таким образом экономятся ресурсы сервера и трафик, которые бы пришлось потратить на передачу неправильных данных.

Валидаторы сравнения

CompareValidator сравнивает значение со значением в другом элементе управления или с константой. Также можно проверить, можно ли конвертировать значение в связанном с ним элементе управления в какой-либо тип.

Свойство Operator позволяет установить операцию, посредством которой происходит сравнение: Equal, NotEqual, GreaterThan, GreaterThanEqual, LessThan, LessThanEqual. Значение DataTypeCheck означает проверку на соответствие типу.

Свойство Type может принимать значения String, Integer, Date, Double и Currency.

Свойство ControlToCompare задает элемент управления, с которым происходит сравнение. ValueToCompare задает значение. Из этих двух свойств установленным может быть только одно.

RangeValidator проверяет соответствие введенного значения диапазону, заданному свойствами MinimumValue и MaximumValue:

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:RangeValidator ID="RangeValidator1" runat="server" 
    ControlToValidate="TextBox1"
    ErrorMessage="Не больше 10 бутылок пива в одни руки" 
    MaximumValue="10" MinimumValue="1" Type="Integer">
</asp:RangeValidator>
< Лекция 4 || Лекция 5: 123 || Лекция 6 >
Алексей Савельев
Алексей Савельев

https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx

Денис Прокофьев
Денис Прокофьев

Везде написано, что это самый независимый и простой в использовании навигационный элемент управления, что он работает сразу с web.sitemap и не требует определения SiteMapDataSource.

Моя карта сайта состоит из двух страниц, вложенных друг в друга. asp:Menu, asp:TreeView отбображаются как ожидалось, а вот asp:SiteMapPath - нет. Он не виден нигде. Однако на его месте формируется разметка: <span id="SiteMapPath1"><a href="#SiteMapPath1_SkipLink" style="position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden;">Проход по ссылкам навигации</a><a id="SiteMapPath1_SkipLink"></a></span> - т.е. элемент отрабатывает.

В словах xHTML это выглядит так: <asp:SiteMapPath ID="SiteMapPath1" runat="server" />. Причем не важно - внутри тега form или снаружи - всегда одинаково.

Т.к. другие нав. ЭУ работают через простой источник данных без ошибок, делаю вывод - карта составлена правильно. ИД: <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

Карта: <?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/L11_1_simplePage.aspx" title="Страница 1"  description="Простая страница 1." >
    <siteMapNode url="~/L11_1SimplePage2.aspx" title="Страница 2"  description="Простая страница 2" />
  </siteMapNode>
</siteMap>

Почему так происходит? Вроде делаю все по примерам. VS Community 2015. NetFramework в проекте: v4.0.30319

Зарина Каримова
Зарина Каримова
Казахстан, Алматы, Гимназия им. Ахмета Байтурсынова №139, 2008
Akiyev Begench
Akiyev Begench
Беларусь, Полоцк, полоцкий государственный университет