【问题标题】:ASP.Net Prevent compare validator and regular expression validator from firing at the same timeASP.Net 防止比较验证器和正则表达式验证器同时触发
【发布时间】:2016-02-23 04:21:56
【问题描述】:

我有两个这样的文本框:

<asp:TextBox ID="textBox1" runat="server" />
<asp:RegularExpressionValidator ID="regExTextBox1" runat="server" ControlToValidate="textBox1" ErrorMessage="Not a positive real number." Display="Dynamic" ValidationExpression="(^0*[1-9]+\d*(\.\d+)?$)|(^0*\.0*[1-9]+\d*$)" />
<asp:RequiredFieldValidator ID="reqFldTextBox1" runat="server" ControlToValidate="textBox1" ErrorMessage="Enter a number." Display="Dynamic" />

<asp:TextBox ID="textBox2" runat="server" />
<asp:RegularExpressionValidator ID="regExTextBox2" runat="server" ControlToValidate="textBox2" ErrorMessage="Not a positive real number." Display="Dynamic" ValidationExpression="(^0*[1-9]+\d*(\.\d+)?$)|(^0*\.0*[1-9]+\d*$)" />
<asp:RequiredFieldValidator ID="reqFldTextBox2" runat="server" ControlToValidate="textBox2" ErrorMessage="Enter a number." Display="Dynamic" />
<asp:CompareValidator id="compareValidator" runat="server" ControlToValidate="textBox2" ControlToCompare="textBox1" Type="Double" Display="Dynamic" Operator="LessThan" Text="Error." />

这两个文本框具有正则表达式验证器,这些验证器将它们限制为只允许正实数。这些工作正常。

我还希望第二个文本框中的输入小于第一个。为此,我有一个比较验证器。

当用户有正确的数字时,比较验证器可以正常工作。

当他们输入任何未能通过第二个正则表达式验证器的内容时​​,比较验证器也会同时触发。

第一个文本框中的内容、有效输入、错误输入或什至什么都没有关系。第二个验证器都失败了。

即使验证器应该比较双精度数。

有没有简单的解决方法?

我意识到这种行为是好的,因为验证器在应该是无效的时候是无效的,但是用户会看到不正确的错误消息。

我已经完成了一个涉及自定义验证器和 Javascript 的解决方案,如果归结为它,那么我将不得不再次这样做。但如果是这种情况,那么使用比较验证器就没有多大意义了,因为它永远不会与正则表达式验证器一起使用。

【问题讨论】:

    标签: asp.net validation


    【解决方案1】:

    将不同的验证组分配给正则表达式验证器并比较验证器并使用ASP.NET内置的javascript函数Page_ClientValidate()逐一检查验证。

    <asp:TextBox ID="textBox1" runat="server" />
    <asp:RegularExpressionValidator ID="regExTextBox1" runat="server" ControlToValidate="textBox1" ErrorMessage="Not a positive real number." Display="Dynamic" ValidationExpression="(^0*[1-9]+\d*(\.\d+)?$)|(^0*\.0*[1-9]+\d*$)" ValidationGroup="Group1" />
    <asp:RequiredFieldValidator ID="reqFldTextBox1" runat="server" ControlToValidate="textBox1" ErrorMessage="Enter a number." Display="Dynamic" ValidationGroup="Group2"/>
    
    <asp:TextBox ID="textBox2" runat="server" />
    <asp:RegularExpressionValidator ID="regExTextBox2" runat="server" ControlToValidate="textBox2" ErrorMessage="Not a positive real number." Display="Dynamic" ValidationExpression="(^0*[1-9]+\d*(\.\d+)?$)|(^0*\.0*[1-9]+\d*$)" ValidationGroup="Group1" />
    <asp:RequiredFieldValidator ID="reqFldTextBox2" runat="server" ControlToValidate="textBox2" ErrorMessage="Enter a number." Display="Dynamic" ValidationGroup="Group2" />
    <asp:CompareValidator id="compareValidator" runat="server" ControlToValidate="textBox2" ControlToCompare="textBox1" Type="Double" Display="Dynamic" Operator="LessThan" Text="Error." ValidationGroup="Group3" />
    
    <asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="return Validate()" />
    

    在 Javascript 中

        <script type="text/javascript">
            function Validate() {
                var isValid = false;
                isValid = Page_ClientValidate('Group1');
                if (isValid) {
                    isValid = Page_ClientValidate('Group2');
                }
                if (isValid) {
                    isValid = Page_ClientValidate('Group3');
                }
                return isValid;
            }
        </script>
    

    【讨论】:

    • 按顺序评估它们效果很好。我稍微修改了您的实现,以便在文本更改时动态调用它。我添加了一个 onchange="Validate();"标记到第二个文本框,它就像一个魅力。
    【解决方案2】:

    我认为您应该为第二个文本框使用自定义验证器,以确认如果正则表达式验证通过,就会发生比较逻辑。您可以通过以下方式进行 -

    <asp:Textbox id="textBox2" runat="server" text=""></asp:Textbox>
    <asp:CustomValidator id="CustomValidator2" runat="server" 
    ControlToValidate = "textBox2"
    ErrorMessage = "Your Error Message"
    ClientValidationFunction="validateLength" >
    </asp:CustomValidator>
    
    <script type="text/javascript">
    function validateLength(oSrc, args){
     // your validation logic here
    }
    </script>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多