Вопрос по custom-validators, asp.net, customvalidator, c# – CustomValidator не работает хорошо

9

У меня есть следующий кусок осины:

<asp:ValidationSummary ID="RegisterUserValidationSummary" runat="server" CssClass="failureNotification" 
        ValidationGroup="RegisterUserValidationGroup"/>

...

<asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserNameTB">Username:</asp:Label>
<asp:TextBox ID="UserNameTB" runat="server" CssClass="textEntry"></asp:TextBox>
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" ControlToValidate="UserNameTB" 
      ValidationExpression="[a-zA-Z]{3,8}" ErrorMessage="Username must be between 3 to 8 chars" runat="server"
      CssClass="failureNotification" ToolTip="Username must be between 3 to 8 chars" ValidationGroup="RegisterUserValidationGroup">
    *</asp:RegularExpressionValidator>
<asp:CustomValidator ID="NoUserValidator" ControlToValidate="UsernameTB" runat="server" ErrorMessage="User Taken!" CssClass="failureNotification" 
      ValidationGroup="RegisterUserValidationGroup"  OnServerValidate="UserValidate">*</asp:CustomValidator>

И тогда функция:

protected void UserValidate(object source, ServerValidateEventArgs args)
    {
        SqlDataSource1.SelectCommand = "SELECT ClientID FROM [Clients] WHERE Username= '" + UserNameTB.Text + "'";
        DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);
        if (dv.Table.Rows.Count != 0)
            args.IsValid = false;
        else
            args.IsValid = true;
    }

Кнопка:

<asp:Button ID="CreateUserButton" runat="server" CommandName="MoveNext" Text="Create User" 
       ValidationGroup="RegisterUserValidationGroup" 
       onclick="CreateUserButton_Click"/>

Проблема в том, что, хотя пользовательская функция проверки вызывается и устанавливает.IsValid ложно, логика кнопок все еще работает!

Я не вижу кнопку в вашей разметке, но должен убедиться, что для ее группы ValidationGroup установлено значение RegisterUserValidationGroup. Gloopy
Я добавил код кнопки в сообщение RanH
Я не уверен, стоит ли это чего-либо, но я также попытался установить NoUserValidator.IsValid = false RanH

Ваш Ответ

1   ответ
11

чтобы убедиться, что страница действительна

protected void CreateUserButton_Click(object sender, EventArgs e)
{
    if (Page.IsValid)
    { 
        // Create the user
    }
}

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

Альтернативой является проверка на стороне клиента. Если вы посмотрите на исходный код страницы, сгенерированный вашим браузером, вы увидите, что Javascript добавлен дляRegularExpressionValidator, Его поведение известно и обрабатывается на стороне клиента, поэтому для оценки выражения и проверки страницы не требуется постбэк (все это обрабатывается javascript). Пользовательская функция валидатора неизвестна, поэтому требуется обратная передача, если вы сами не определите сценарий валидации на стороне клиента.

Здесь ссылка на дополнительную информацию оMSDN.

На самом деле, я не уверен, поэтому я просто собираюсь угадать, но я думаю, что это потому, что другие валидаторы проверяют на стороне клиента, в то время как пользовательский валидатор проверяет на стороне сервера. Поскольку это сторона сервера, обратная передача уже началась, и вы сначала выполняете свой пользовательский валидатор, а затем функцию нажатия кнопки. Имеет ли это смысл?
Эта ссылка описывает это довольно хорошоhttp://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.customvalidator(v=vs.80).aspx
Спасибо, это исправило, не могли бы вы объяснить, почему он отлично работает с другими валидаторами, а для кастомного мне пришлось добавить то, что вы написали? RanH
Благодарю. Это действительно помогло мне. Случайно у вас естьMSDN ссылка на это? Или любая другая статья / ссылка на блог?
То, что они установлены на runat = server, означает только то, что сервер сгенерировал их, и что вы можете получить к ним доступ через код. Но если вы посмотрите на исходный код страницы, сгенерированный вашим браузером, вы увидите, что для регулятора regularexpressionvalidator добавлены сценарии JavaScript. Его поведение известно, поэтому для оценки выражения и проверки страницы не требуется никакой обратной ссылки (все это обрабатывается javascript). Пользовательская функция проверки не известна, поэтому требуется обратная передача (если вы не настроили клиентский сценарий проверки в javascript).

Похожие вопросы