我在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();
,但这对我来说似乎很肮脏,验证器会在复选框被检查时被调用两次。
我已经在V3验证器上将ValidateEmtpyText设置为true,但它不会改变行为。 – Marcel 2013-02-13 08:57:01
我故意错过了ControlToValidate,因为验证不仅仅依赖于控件,而是依赖于服务器端的其他东西。 – Marcel 2013-02-13 08:58:11
它不仅仅是V3验证器没有被调用。检查时,所有被调用,取消选中没有被调用。 – Marcel 2013-02-13 08:59:21