ASP.NET RegularExpressionValidator触发CompareValidator

时间:2015-08-11 21:38:48

标签: asp.net

基本上,我的代码看起来像这样:

<div>

  <asp:TextBox ID="txtBox1" class="inline-block" runat="server" />
  <asp:RegularExpressionValidator ID="regExTxtBox1" runat="server" ControlToValidate="txtBox1" ErrorMessage="Enter an integer or decimal greater than 0." Display="Dynamic" ValidationExpression="(^0*[1-9]+\d*(\.\d+)?$)|(^0*\.0*[1-9]+\d*$)" />
  <asp:RequiredFieldValidator ID="reqFldTxtBox1" runat="server" ControlToValidate="txtBox1" ErrorMessage="Requires a number." Display="Dynamic" InitialValue="" />
  <asp:CompareValidator id="cmprTxtBox1" runat="server" ControlToValidate="txtBox1" ControlToCompare="txtBox2" Type="Double" Display="Dynamic" Operator="LessThanEqual" Text="Error: txtBox1 is greater than txtBox2." />

</div>

<br />

<div>

  <asp:TextBox ID="txtBox2" runat="server" />
  <asp:RegularExpressionValidator ID="regExTxtBox2" runat="server" ControlToValidate="txtBox2" ErrorMessage="Enter an integer or decimal greater than 0." Display="Dynamic" ValidationExpression="(^0*[1-9]+\d*(\.\d+)?$)|(^0*\.0*[1-9]+\d*$)" />
  <asp:RequiredFieldValidator ID="reqFldTxtBox2" runat="server" ControlToValidate="txtBox2" ErrorMessage="Requires a number." Display="Dynamic" InitialValue="" />

</div>

我有两个使用正则表达式验证器的文本框,以强制用户只输入整数或小数。我还希望txtBox2中的输入大于txtBox1,所以我在txtBox1上使用了比较验证器,以检查txtBox1中的数字何时大于txtBox2。

我遇到的问题是我的CompareValidator总是在RegularExpressionValidator触发时触发。当txtBox1中存在正常数字且txtBox2中没有任何内容时,CompareValidator完全满足。但是,只要RegularExpressionValidator失败,它就会失败,无论txtBox2中的内容是什么。

当然,系统运行正常,因为当验证器返回无效时,用户无法以任何方式输入任何值。但我不希望用户看到不必要的错误消息。

如果没有任何解决方案,我认为我可以实现自定义验证器。

2 个答案:

答案 0 :(得分:1)

请使用验证组检查属性..... For和Validation Control并将相同的验证组设置为提交按钮,以便它将验证按钮单击..... 我希望它能帮助你......

答案 1 :(得分:1)

我想出了一个解决方法。

对于带有比较验证器的文本框,我添加了一个&#39; onchange&#39;调用javascript方法。在该方法中,它检查正则表达式是否失败。如果有,则将比较验证器设置为true,然后更新显示。

javascript中的实现如下所示:

function txtBoxChanged() {

    var txtBox1 = document.getElementById('<%=txtBox1.ClientID%>').value;

    var rgx = new RegExp(/^0*[1-9]+\d*(\.\d+)?$|^0*\.0*[1-9]+\d*$/)

    if (!(rgx.test(txtBox1))) {

      document.getElementById('<%=cmprTxtBox1.ClientID%>').isvalid = true;
      ValidatorUpdateDisplay(document.getElementById('<%=cmprTxtBox1.ClientID%>'));

    }

}

我的HTML:

<div>

  <asp:TextBox ID="txtBox1" class="inline-block" runat="server" onchange="txtBoxChanged()" />
  <asp:RegularExpressionValidator ID="regExTxtBox1" runat="server" ControlToValidate="txtBox1" ErrorMessage="Enter an integer or decimal greater than 0." Display="Dynamic" ValidationExpression="(^0*[1-9]+\d*(\.\d+)?$)|(^0*\.0*[1-9]+\d*$)" />
  <asp:RequiredFieldValidator ID="reqFldTxtBox1" runat="server" ControlToValidate="txtBox1" ErrorMessage="Requires a number." Display="Dynamic" InitialValue="" />
  <asp:CompareValidator id="cmprTxtBox1" runat="server" ControlToValidate="txtBox1" ControlToCompare="txtBox2" Type="Double" Display="Dynamic" Operator="LessThanEqual" Text="Error: txtBox1 is greater than txtBox2." />

</div>

<div>

  <asp:TextBox ID="txtBox2" runat="server" onchange="txtBoxChanged()" />
  <asp:RegularExpressionValidator ID="regExTxtBox2" runat="server" ControlToValidate="txtBox2" ErrorMessage="Enter an integer or decimal greater than 0." Display="Dynamic" ValidationExpression="(^0*[1-9]+\d*(\.\d+)?$)|(^0*\.0*[1-9]+\d*$)" />
  <asp:RequiredFieldValidator ID="reqFldTxtBox2" runat="server" ControlToValidate="txtBox2" ErrorMessage="Requires a number." Display="Dynamic" InitialValue="" />

</div>

我必须这样做,所以两个文本框都调用了这个方法。否则,即使正则表达式在txtBox2上失败,也会显示比较验证器。这是有道理的,因为它正在查看两个文本框。