为一个控件绑定多个验证器那是很正常的,例如一个邮件输入框,首先它不能为空,其次不为空时邮件地址必须符合一定的规则,介于此,我们会依次放两个验证器,RequiredFieldValidator 和 RegularExpressionValidator。由于输入为空的时候对于 RegularExpressionValidator 是被认为通过的,所以同时只会显示其中一个验证器的错误信息。
再看个需求,比如输入邮件地址和再次确认的邮件地址,这时需要为第二个邮件输入框加除上两之外的第三个验证器 CompareValidator 用于验证两次输入是否一致,那么三个验证器依次是:
RequiredFieldValidator RegularExpressionValidator CompareValidator
如果第一个未验证通过,即输入为空,那其后两个验证器也不会认为不通过而输出错误信息。但是在有输入时,后面两个验证器都不能通过时,你大概不想看到下面那样的显示吧:
你或许只想这时候只显示 "邮件格式错误" 这一条提示,只有邮件格式对了才会进行下一个验证。也就是说当一个控件关联了多个验证器时,需要为它们建立这样一种依赖关系,后一个验证器总是依赖于前一个验证器,只有前一个验证器通过了,才会进行下一个验证。这样就能保证同时只会出现一个验证器的提示信息。
为此最初是考虑用一个 CustomValidator 来替代以上三个验证控件,所有的验证逻辑代码以及不通过时提示什么都要自己一行行编写,着实是麻烦。更要命的是要实现两份代码,客户端的 JS 验证代码,还有服务端的 C# 代码。实现固然是没问题的。
同时还等待着高人出手相助,在 CSDN 上下了这篇贴子:一个控件关联了多个验证器,如何指定它们的依赖关系,果然觅得了一个很棒的答案。仍然是使用以上三个验证器,只要在页面中放入下面一段 JS 代码,它们就能互相协调起来了。
1 2 3 4 5 6 7 8 9 10 |
<script type="text/javascript"> var _ValidatorUpdateDisplay = ValidatorUpdateDisplay; ValidatorUpdateDisplay = function(val) { for (var i=0,v; i<Page_Validators.length && (v = Page_Validators[i]) != val; i++) { if (v.controltovalidate == val.controltovalidate && !v.isvalid) val.isvalid = true; } _ValidatorUpdateDisplay(val); } </script> |
再次使用前面截图的输入,你就发现只会显示一条错误信息:"邮件格式错误",而在确认邮件里输入的是一个与前个框不同的邮件地址时,就只提示 "两次输入不一致"。
确实是很高明,非常的感谢 jshi123 的分享精神。叫谁来写这么一段的话一时半会儿是很难想得到的,不过对照一下生成的页面源文件相信还是不太难理解吧。
本文链接 https://yanbin.blog/asp-net-show-one-validitor-message/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。