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 有意设置为 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();回发,但这对我来说似乎很脏,并且当复选框被选中时,验证器会被调用两次。
4

3 回答 3

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();
}

这现在按预期工作。

于 2013-02-13T11:33:01.180 回答
0

您需要设置ValidateEmptyTexttrue.

你错过了一个ControlToValidateCustomValidator

于 2013-02-13T08:51:30.817 回答
0

您是否尝试过将控件组合在一起?在他们身上放置一个 ValidationGroup。

于 2013-02-13T08:59:04.037 回答