【问题标题】:Using validators to ensure that user filled either one of two required fields使用验证器确保用户填写了两个必填字段之一
【发布时间】:2011-01-11 10:20:00
【问题描述】:

我有一个ASP.NET 表单,用于请求货币兑换。那里有两个文本字段:amount-source 和amount-target。

其中一个必须填写,而且只有一个。

如果适用,如何使用验证器来实现这一点?

【问题讨论】:

    标签: c# asp.net .net validation asp.net-2.0


    【解决方案1】:

    您可以为此使用自定义验证器:

    <asp:Textbox id="textbox1" runat="server" />
    <asp:CustomValidator id="valCustom" runat="server"
        ControlToValidate="textbox1"
        ClientValidationFunction="ClientValidate"
        OnServerValidate="ServerValidate"
        ErrorMessage="*You can only enter 1" display="dynamic">*
    </asp:CustomValidator>
    
    <asp:Textbox id="textbox2" runat="server" />
    <asp:CustomValidator id="valCustom2" runat="server"
        ControlToValidate="textbox2"
        ClientValidationFunction="ClientValidate"
        OnServerValidate="ServerValidate"
        ErrorMessage="*You can only enter 1" display="dynamic">*
    </asp:CustomValidator>
    
    <script language="Javascript">
      function ClientValidate(source, arguments)
      {
        var tb1 = document.getElementById("<%=textbox1.ClientID %>").value;
        var tb2 = document.getElementById("<%=textbox2.ClientID %>").value;
        if (tb1 && tb2 || (!tb1 && !tb2)){
            arguments.IsValid = false;
        } else {
            arguments.IsValid = true;
        }
      }
    </script>
    

    服务器端:

    protected void ServerValidate(object sender, ServerValidateEventArgs args)
    {
      if(string.isNullOrEmpty(textbox1.Text) && string.isNullOrEmpty(textbox2.Text))
        args.IsValid = false;
      else if(!string.isNullOrEmpty(textbox1.Text) && !string.isNullOrEmpty(textbox2.Text))
        args.IsValid = false;
      else
        args.IsValid = true;
    }
    

    如果您使用的是 jQuery,请发表评论...这一切都会更简洁。

    【讨论】:

    • 复制示例代码时要小心——“dispaly”应该是“display”(出现两次)
    • 如果两者都为空,我发现这不起作用:如果文本框为空,则其自定义验证器不会触发。
    • 我发现要在两者都为空的情况下(在服务器端)进行这项工作,我需要使用没有任何 ControlToValidate 属性的单个 CustomValidator 实例。
    • @ChrisW,只需将 ValidateEmptyText 属性设置为 true。发生这种情况是因为默认情况下,如果验证器正在查看一个空字段,它将完全跳过验证。
    • 不需要 2 个自定义验证器,一个就足够了 - 除非您想为两个控件的事件触发验证,例如更改事件。
    【解决方案2】:

    我会实现一个自定义验证器并用它装饰两个文本框。如果两者都被填满,那么两者都处于错误状态。

    【讨论】:

      猜你喜欢
      • 2015-03-08
      • 1970-01-01
      • 2011-07-16
      • 2021-10-09
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多