我在我的 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 有意设置为 false 以保持低网络负载。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();
回发,但这对我来说似乎很脏,并且当复选框被选中时,验证器会被调用两次。