ASP.NET C#文本框特定无效PIN值校验的最优实现方法
原有CustomValidator错误不消失的根因
你的JS校验代码存在两处语法逻辑错误,导致校验失效:
- 未获取文本框的实际输入值,直接将jQuery DOM对象传入匹配逻辑,永远不会命中无效值规则
- 括号位置书写错误,将比较逻辑写进了
indexOf方法的入参中,判断逻辑完全失效
修正后的JS代码如下:
function IsPINValid(sender, args) { args.IsValid = true; // 获取输入框实际值 var inputPIN = $('#<%=txtPIN.ClientID %>').val(); var invalidPINs = "111111,000000"; var arrInvalidPINs = invalidPINs.split(','); // 修正括号位置 if (arrInvalidPINs.indexOf(inputPIN) > -1) { args.IsValid = false; } }
使用RegularExpressionValidator实现需求的方案
完全可以通过原生RegularExpressionValidator实现该需求,直接在ValidationExpression属性中配置带否定前瞻的正则表达式,即可拦截多个指定无效值,无需自行编写JS校验逻辑。
控件配置代码
<asp:RegularExpressionValidator ID="revNewPIN" runat="server" SetFocusOnError="true" ControlToValidate="txtPIN" ValidationExpression="^(?!000000)(?!111111)\d{6}$" ErrorMessage="Invalid PIN" ForeColor="Red" Font-Size="Small" Display="Dynamic">Invalid PIN</asp:RegularExpressionValidator> <asp:TextBox ID="txtPIN" runat="server" TextMode="Password" CssClass="form-control" MaxLength="6"></asp:TextBox>
正则表达式说明
^(?!000000)(?!111111)\d{6}$的规则逻辑:
^匹配输入内容的开头(?!000000)否定前瞻规则:输入内容不能是000000(?!111111)否定前瞻规则:输入内容不能是111111\d{6}要求输入必须是恰好6位数字$匹配输入内容的结尾
如果后续需要新增拦截的无效PIN,比如222222、123456,只需要在正则开头新增对应的否定前瞻规则即可,比如^(?!000000)(?!111111)(?!222222)(?!123456)\d{6}$。
注意:RegularExpressionValidator会同时触发客户端和服务端双重校验,比仅自定义客户端JS校验安全性更高,避免用户通过禁用JS绕开校验规则。
内容的提问来源于stack exchange,提问作者frank3579
相关产品推荐
相关产品推荐

