|
https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx |
AutoPostBack. Привязка к данным. Коллекции. Проверка правильности вводимых данных
ValidationSummary
Класс ValidationSummary позволяет вывести итоговую информацию по всем валидаторам на странице. Она может быть выведена в различной форме:
- BulletList — список со значками;
- List — обычный список;
- SingleParagraph — простой параграф.
Информацию можно выводить на странице, а можно в информационном окне, если ShowMessage поставить в True. Для всех валидаторов выводится свойство Error Message, а не текст. Text выводится в самом валидаторе.
Вернемся к странице Registration.aspx. Добавим в него еще одно поле для ввода пароля:
<form runat="server" id="input">
<asp:Label ID="Label1" runat="server" Text="Введите имя:"
Width="140px"></asp:Label>
<asp:TextBox ID="txtName" runat="server" CausesValidation="True"
/>
<asp:Label ID="Label2" runat="server" Text="Введите адрес:"
Width="140px"></asp:Label>
<asp:TextBox id="txtAddress" runat="server" textmode="multiline"
rows="5"
/>
<br/><br />
<asp:Label ID="Label3" runat="server" Text="Введите пароль:"
Width="140px"></asp:Label>
<asp:TextBox id="txtPassword" runat="server" textmode="password" />
<br />
<br />
<asp:Label ID="Label4" runat="server" Text="Повторите пароль"
Width="140px"></asp:Label>
<asp:TextBox id="TextBox1" runat="server" textmode="password"
/><br />
<asp:Button ID="Button1" runat="server" Text="Submit" />
</form>Свойство CausesValidation работает, когда элемент управления теряет фокус. В таком случае связанный с ним валидатор показывает значение своего свойства Text.
Нам нужно, чтобы имя было обязательно введено, а пароль совпадал в обоих текстовых полях.
Перетащите RequiredFieldValidator и бросьте его на форму. ControlToValidate установите в txtName. Второй валидатор — Required FieldValidator для пароля. Третий — CompareValidator, который сравнивает значение паролей:
<asp:RequiredFieldValidator ID="RequiredFieldValidator1"
ControlToValidate="txtName"
Display="Static" ErrorMessage="Имя необходимо ввести"
runat="server" >*</asp:RequiredFieldValidator>
<asp:RequiredFieldValidator ID="RequiredFieldValidator2"
runat="server" ErrorMessage="Пароль не должен быть пустым"
ControlToValidate="txtPassword1">*</asp:RequiredFieldValidator>
<asp:CompareValidator ID="CompareValidator1" runat="server"
ControlToValidate="txtPassword1"
ErrorMessage="Пароли должны совпадать!"
ControlToCompare="txtPassword2"></asp:CompareValidator><br />А также один ValidationSummary:
<asp:ValidationSummary ID="ValidationSummary1" runat="server" />
Поставим кнопку, при нажатии на которую будет происходить проверка:
<asp:Button ID="Button1" runat="server" Text="Валидация" OnClick="Validate_Click" />
Обработчик нажатия на кнопку подтверждает ввод, если валидация прошла успешно:
protected void Validate_Click(object sender, EventArgs e)
{
if (Page.IsValid)
{
lblName.Text = "";
lblAddress.Text = "";
lblPassword.Text = "";
input.Visible = false;
if (txtName.Text != "")
lblName.Text = "Вы ввели имя: " + txtName.Text;
if (txtAddress.Text != "")
lblAddress.Text = "Вы ввели адрес: " +
txtAddress.Text;
if (txtPassword1.Text != "")
lblPassword.Text = "Вы ввели пароль: " +
txtPassword1.Text + "<br>Спасибо за регистрацию!";
}
}Вся проверка этой страницы происходит у клиента. Можете даже остановить сервер, чтобы в этом убедиться. Только когда все данные введены правильно, происходит отправка формы на сервер.
CustomValidator
Если нужно сделать такую проверку, которую не получается осуществить с помощью стандартных валидаторов, в игру вступает Custom Validator. В классе CustomValidator можно написать любую функцию, которая будет проверять значения как на стороне сервера, так и у клиента. Классический пример — проверка числа на четность.
Напишем пользовательский валидатор, который будет проверять пароль на длину — не меньше 5 символов:
<head>
<title>Регистрация нового пользователя</title>
<script language="JavaScript">
function validatePassword(oSrc, args)
{
args.IsValid = (args.Value.length > 5);
}
</script>
</head>
<asp:CustomValidator ID="CustomValidator1" runat="server"
ControlToValidate="txtPassword1"
ErrorMessage="Слишком короткий пароль" Display="Static"
ClientValidationFunction="validatePassword"
>*</asp:CustomValidator>Проверка происходит на стороне клиента функцией на JavaScript validatePassword. Для этого надо в свойстве ClientValidationFunction записать имя функции. В сгенерированном коде к кнопке привязан такой код:
<input type="submit" name="Button1" value="Button"
onclick="javascript:WebForm_DoPostBackWithOptions(new
WebForm_PostBackOptions("Button1", "true", "false", "false"))"
id="Button1" />Известно, что если функция, связанная с onclick, вернет логическое значение false, форма не будет отправлена на сервер:
<asp:CustomValidator ID="CustomValidator1" runat="server"
ControlToValidate="txtPassword1"
ErrorMessage="Слишком короткий пароль" Display="Static"
OnServerValidate="ServerValidate"
>*</asp:CustomValidator><br />Произведем такую же валидацию на сервере. Чтобы запустить проверку на сервере, используется свойство OnServerValidate. Функция, которая указана в ней, входит в класс страницы и должна быть написана на C#:
void ServerValidate(object source, ServerValidateEventArgs args)
{
string password = args.Value.ToString();
int len = password.Length;
args.IsValid = (len >= 5);
}ServerValidate вызывается после события Page_Load, поэтому нельзя, как в "Серверные элементы управления" , выводить результаты в Page_Load.
Можно также одновременно проводить и клиентскую, и серверную валидацию:
<asp:CustomValidator ID="CustomValidator1" runat="server"
ControlToValidate="txtPassword1"
ErrorMessage="Слишком короткий пароль" Display="Static"
OnServerValidate="ServerValidate"
ClientValidationFunction="validatePassword"
>*</asp:CustomValidator>Чтобы отключить возможность генерации клиентского кода для всех валидаторов, можно написать
void Page_Load()
{
foreach (BaseValidator bv in Page.Validators)
{
bv.EnableClientScript = false;
}
}Для отображения сообщения об ошибке можно использовать звуки и картинки. Для этого в свойство ErrorMessage нужно записать не текст, а соответствующие теги HTML, например
ErrorMessage=’<img src="error.gif">’
Группы валидации
Иногда бывает нужно иметь на странице несколько кнопок, и при нажатии на каждую вводится информация из логически взаимосвязанных групп элементов управления. Поэтому должны проверяться значения только из этой группы. У всех валидаторов и элементов управления, через которые возможен ввод информации, есть свойство ValidationGroup. Функцию Page.Validate() тоже можно использовать с таким параметром. Если происходит нажатие на кнопку с установленным ValidationGroup, запускается проверка тех валидаторов, у которых это свойство такое же.
Заключение
Назначение форм — в том, чтобы получать данные от пользователей, но данные не имеют смысла, если они введены неправильно. Элементы- валидаторы позволяют автоматизировать рутинные действия по проверке данных и гарантировать ввод данных, соответствующих нашим требованиям.