基本上,我的代码看起来像这样:
<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中的内容是什么。
当然,系统运行正常,因为当验证器返回无效时,用户无法以任何方式输入任何值。但我不希望用户看到不必要的错误消息。
如果没有任何解决方案,我认为我可以实现自定义验证器。
答案 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上失败,也会显示比较验证器。这是有道理的,因为它正在查看两个文本框。