Опубликован: 14.11.2006 | Доступ: свободный | Студентов: 5898 / 532 | Оценка: 4.18 / 3.74 | Длительность: 16:37:00
ISBN: 978-5-9556-0085-7
Лекция 5:

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

< Лекция 4 || Лекция 5: 123 || Лекция 6 >
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, запускается проверка тех валидаторов, у которых это свойство такое же.

Заключение

Назначение форм — в том, чтобы получать данные от пользователей, но данные не имеют смысла, если они введены неправильно. Элементы- валидаторы позволяют автоматизировать рутинные действия по проверке данных и гарантировать ввод данных, соответствующих нашим требованиям.

< Лекция 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