Встроенные элементы валидации

170

В состав ASP.NET Framework входят средства проверки достоверности клиентской стороны, которые не привязаны к HTML5 и будут работать в любом браузере. В примере ниже показано, как применять многофункциональные элементы управления вместе со средствами проверки, предлагаемыми ASP.NET:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CreateGame.aspx.cs" Inherits="ClientDev.CreateGame" %>

<!DOCTYPE html>
<html>
<head runat="server">
    ...
    <%: System.Web.Optimization.Scripts.Render("~/bundle/validation") %>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ValidationSummary runat="server" CssClass="error" />
        <table>
            <tr>
                <td>Название:</td>
                <td><input id="Name" runat="server" /></td>
                <td>
                    <asp:RequiredFieldValidator runat="server" ControlToValidate="Name" 
                        ErrorMessage="Имя должно быть указано" CssClass="error" Text="*" />
                </td>
            </tr>
            <tr>
                <td>Категория:</td>
                <td><input id="Category" runat="server" /></td>
                <td>
                    <asp:RequiredFieldValidator runat="server" ControlToValidate="Category" 
                        ErrorMessage="Категория должна быть указана" CssClass="error" Text="*"/>
                </td>
            </tr>
            <tr>
                <td>Цена:</td>
                <td><input id="Price" runat="server" /></td>
                <td>
                    <asp:RequiredFieldValidator runat="server" ControlToValidate="Price" 
                        ErrorMessage="Цена должна быть указана" CssClass="error" Text="*" />
                    <asp:RangeValidator runat="server" ErrorMessage="Цена должна находиться в пределах от 1 до 10000."
                         MinimumValue="1" MaximumValue="10000" Text="*" CssClass="error" ControlToValidate="Price" />
                </td>
            </tr>
            ...
        </table>
    </form>
</body>
</html>

Нам пришлось внести два подготовительных изменения. Первое изменение связано с добавлением пакета для проверки достоверности, который был определен ранее, а второе касается замены стандартного элемента button элементом <input> серверной стороны. Мы могли бы также воспользоваться элементом управления Button, но элементы button не сработают, поскольку необходимо, чтобы среда ASP.NET добавила определенный код обработки событий JavaScript, а это делается только для элементов <input>.

После описанных изменений можно использовать элементы управления проверкой достоверности, которые представляют собой элементы управления, добавляемые к разметке для выполнения проверки достоверности в отношении элементов <input>. Мы применяем два таких элемента управления: RequiredFieldValidator гарантирует, что пользователь предоставит значение, a RangeValidator - что предоставленное пользователем значение находится в пределах указанного набора границ.

Элементы управления проверкой достоверности обладают рядом удобных возможностей. Например, они гладко интегрируются со сводкой по проверке для отображения сообщений об ошибках проверки достоверности клиентской стороны. Чтобы убедиться в этом, запустите приложение, запросите веб-форму CreateGame.aspx и отправьте форму, ничего не вводя в элементах <input>. Сообщения об ошибках, указанные с помощью атрибута ErrorMessage, отобразятся в элементах, сгенерированных элементом управления ValidationSummary, и это не требует никакой дополнительной работы. Кроме того, строка, указанная в атрибуте Text, отображается в том месте разметки, где добавлен элемент управления проверкой достоверности. (Мы задали в качестве строки символ звездочки.)

Использование элементов управления проверкой достоверности ASP.NET Framework

Тем не менее, с этими элементами управления связаны и недостатки. Прежде всего, мы должны использовать множество элементов управления для применения различных аспектов политики проверки достоверности. Так как элементы управления проверкой достоверности работают за счет генерации скрытых элементов <span>, могут возникнуть проблемы, касающиеся компоновки. Чтобы увидеть пример проблемы с компоновкой, введите значение 0 в поле "Цена" и щелкните на кнопке "Добавить игру". Это приведет к получению ответа от элемента управления RangeValidator, представленного на рисунке ниже:

Проблемы с выравниванием в HTML-разметке элементами управления проверкой достоверности

Символ звездочки, отображаемый элементом управления RangeValidator, не выровнен с символами звездочки для других элементов управления, которые также были активизированы. Причина в том, что скрытый элемент <span>, сгенерированный элементом управления RequiredFieldValidator для поля "Цена", не виден, но по-прежнему занимает место в разметке. Это можно исправить с помощью тщательно разработанного стиля CSS или кода JavaScript, но мы предпочитаем использовать свои навыки JavaScript для создания более прямого решения, которое будет продемонстрировано позже.

Самая серьезная проблема, связанная с элементами управления проверкой достоверности, заключается в том, что они также принудительно применяют проверку достоверности серверной стороны. Это имело большой смысл до появления в ASP.NET средства привязки моделей, но работать с ним нелегко. Проверка достоверности клиентской стороны пропускается, если в браузере отключена поддержка JavaScript, и данные формы отправляются прямо серверу. Пользовательские данные проверяются с помощью элементов управления проверкой достоверности и атрибутов проверки, приводя к дублированию ошибок проверки:

Дублирование ошибок проверки достоверности

Это происходит только при отключенной поддержке JavaScript, однако у многих пользователей отсутствует поддержка JavaScript, особенно у корпоративных пользователей по причинам, связанным с безопасностью.

Наконец, как и в случае атрибутов проверки достоверности HTML5, элементы управления проверкой достоверности требуют указания политики проверки в двух местах - в классе модели, где нужно применить проверку достоверности серверной стороны, и в разметке веб-формы, чтобы можно было работать со средствами проверки достоверности клиентской стороны. Можно было бы удалить атрибуты проверки из класса Game, но это нарушит работу привязки моделей и потребует добавления элементов управления проверкой достоверности к каждой веб-форме, где разрешено создание или редактирование объектов данных Game - что представляет собой просто еще одно дублирование, которого мы стараемся избежать.

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

Пройди тесты
Лучший чат для C# программистов