【问题标题】:CheckBox causes validation only on Check, not on UncheckCheckBox 仅在 Check 上导致验证,而不是在 Uncheck 上
【发布时间】:2013-01-28 18:04:16
【问题描述】:

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

【问题讨论】:

    标签: asp.net checkbox webforms postback validation


    【解决方案1】:

    您需要将ValidateEmptyText 设置为true

    您是否在CustomValidator 上缺少ControlToValidate

    【讨论】:

    • 我已在 V3 验证器上将 ValidateEmtpyText 设置为 true,但它不会改变行为。
    • 我故意错过了 ControlToValidate,因为验证不仅依赖于控件,还依赖于服务器端的其他东西。
    • 它不仅没有被调用的 V3 验证器。选中时,全部调用,取消选中时不调用。
    【解决方案2】:

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

    【讨论】:

    • 是的,我试过了,但是没有用。这也是一个问题,因为复选框以外的其他控件(即“继续”按钮)也需要对文本框(以及所有其他输入控件)进行验证。
    【解决方案3】:

    由于似乎没有解决方案,我帮助自己解决了一个问题: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();
    }
    

    现在按预期工作。

    【讨论】:

      猜你喜欢
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 2020-07-09
      • 1970-01-01
      相关资源
      最近更新 更多