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, поэтому нельзя, как в лекции 3, выводить результаты в 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">’