2013-02-13 44 views
1

我在ASP.NET WebForms页面上观察到一个非常奇怪的行为。我有一些输入控件,分配给它们的一个或多个验证器。一个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

由于似乎没有解决方案,我用一种变通方法帮助自己

<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

您是否错过CustomValidatorControlToValidate

+0

我已经在V3验证器上将ValidateEmtpyText设置为true,但它不会改变行为。 – Marcel 2013-02-13 08:57:01

+0

我故意错过了ControlToValidate,因为验证不仅仅依赖于控件,而是依赖于服务器端的其他东西。 – Marcel 2013-02-13 08:58:11

+0

它不仅仅是V3验证器没有被调用。检查时,所有被调用,取消选中没有被调用。 – Marcel 2013-02-13 08:59:21

0

你试过把这些控件分组在一起吗?把一个ValidationGroup放在它们上面。该复选框将不再导致验证,但触发的改变回发:

+0

是的,我试过了,但没有奏效。这也是一个问题,因为除复选框之外的其他控件(即“继续”按钮)需要在文本框(以及所有其他输入控件)上进行验证。 – Marcel 2013-02-13 09:00:59

相关问题