2013-02-13 4 views
1

Я наблюдал очень странное поведение на странице ASP.NET WebForms. У меня есть некоторые элементы управления вводом с одним или несколькими валидаторами, назначенными им.CheckBox вызывает проверку только на Check, а не на Uncheck

Упрощенный пример управления TextBox ввода:

<asp:TextBox ID="TextBoxX" runat="server" 
CausesValidation="True"></asp:TextBox> 

<asp:RequiredFieldValidator ID="V1" runat="server" 
ControlToValidate="TextBoxX" 
ErrorMessage="blah blah" 
EnableViewState="False" /> 

<asp:RangeValidator ID="V2" Type="Integer" runat="server" 
ControlToValidate="TextBoxX" 
ErrorMessage="blah blah" 
MinimumValue="0" MaximumValue="9999" 
EnableViewState="False" /> 

<asp:CustomValidator ID="V3" runat="server" 
ErrorMessage="blah blah" 
OnServerValidate="MyCustomValidateMethod" 
EnableViewState="False" 
EnableClientScript="False" /> 

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

protected void MyCustomValidateMethod(object source, ServerValidateEventArgs args) 
{//...} 

До сих пор все работает должным образом. Но у меня также есть флажок, который позволяет пользователю явно переопределить проверку правдоподобия после появления предупреждения.

<asp:CheckBox ID="CheckBoxOverride" runat="server" Text="You can override here!" 
AutoPostBack="True" 
CausesValidation="True" /> 

Проверка/убрав CheckBox вызывает постбэк как и ожидалось, но валидаторы (и особенно «V3» один) только вызывается, когда поле получает чек, но не тогда, когда он получает бесконтрольно!

Что вызывает это странное поведение и как его исправить?

Вот еще информация:

  • Я использую .NET 3.5.
  • Весь этот материал находится внутри одной UpdatePanel, если это имеет значение.
  • Я могу явным образом позвонить Page.Validate(); по обратной передаче, но это кажется мне грязным, и валидаторы затем вызывают дважды, когда флажок установлен.

ответ

1

Так, кажется, нет никакого решения, я помог себе с Обходной путь: CheckBox будет больше не вызывать проверку, но вызвать обратную передачу на изменения:

<asp:CheckBox ID="CheckBoxOverride" runat="server" Text="You can override here!" 
AutoPostBack="True"  
oncheckedchanged="Override_CheckedChanged" /> 

Затем в обработчике изменения, то Подтверждение валидации:

protected void Override_CheckedChanged(object sender, EventArgs e) { 
     Page.Validate(); 
} 

Это теперь работает так, как ожидалось.

0

Вам необходимо установить ValidateEmptyText на номер true.

Вам не хватает ControlToValidate на CustomValidator?

+0

Я установил ValidateEmtpyText в true на валидаторе V3, но это не изменяет поведение. – Marcel

+0

Я намеренно пропустил ControlToValidate, потому что проверка не только полагается на элемент управления, но и на другие компоненты на стороне сервера. – Marcel

+0

Это не только валидатор V3, который не вызван. При проверке все вызовы вызываются, при отключении никто не вызывается. – Marcel

0

Вы пробовали группировать элементы управления вместе? Поместите на них группу ValidationGroup.

+0

Да, я пробовал, но это не сработало. Кроме того, это проблема, потому что также другие элементы управления, кроме флажка (а именно кнопка «продолжить»), должны вызвать проверку в текстовом поле (и всех других элементах управления вводом). – Marcel