CheckBox仅在Check上导致验证,而不是在Uncheck上

时间:2013-02-13 08:33:36

标签: asp.net checkbox webforms postback validation

我在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();,但这对我来说似乎很脏,然后在检查复选框时调用验证器两次。

3 个答案:

答案 0 :(得分: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();
}

现在按预期工作。

答案 1 :(得分:0)

您需要将ValidateEmptyText设置为true

您是否遗漏了ControlToValidate上的CustomValidator

答案 2 :(得分:0)

您是否尝试将控件组合在一起?将ValidationGroup放在它们上面。