验证控件与Button的OnClientClick事件详细解析


Posted in Javascript onDecember 04, 2013

一、事件

这是一个长期被我忽略或者是没有发现的问题,问题是这样的:

在一个页面中,当有验证控件的时候,当Button控件触发OnClientClick事件,并且这个事件会返回true和false的时候,验证控件就会失效,不起作用了。具体描述如下:

.Net页面如下:

<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<div>
<asp:TextBox ID="TextBoxTest" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBoxTest"
ErrorMessage="不能为空" Display="None"></asp:RequiredFieldValidator><ajaxToolkit:ValidatorCalloutExtender
ID="ValidatorCalloutExtender1" TargetControlID="RequiredFieldValidator1" runat="server">
</ajaxToolkit:ValidatorCalloutExtender>
<asp:Button ID="ButtonText" runat="server" Text="测试" OnClientClick="return confirm('你确定要提交吗?');" />
</div>
</form>

如上,在页面中加入RequireFieldValidator验证控件,使TextBoxTest的值不能为空,在ButtonText提交页面时,要用户确认是否需要提交。很简单的一个页面,貌似也没有什么问题。可是当TextBoxTest的值为空的时候,验证控件竟然不起作用,提交页面成功。这是什么原因呢?

二、响应事件

这是怎么回事呢?首先我将ButtonTest的OnClientClick事件去掉后,验证控件是起作用的。这又是为什么呢?我查看了页面的源代码,发现ButtonTest控件生成如下源代码:

<input type="submit" name="ButtonText" value="测试" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ButtonText", "", true, "", "", false, false))" id="ButtonText" />

从这行源代码可以看出,验证控件在客户端生成了一段javascript代码,验证TextBox中的值是否为空。当我加上ButtonTest的OnClientClick后,我重新查看了源代码,ButtonTest控件生成的源代码如下:

<input type="submit" name="ButtonText" value="测试" onclick="return confirm('你确定要提交吗?');WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ButtonText", "", true, "", "", false, false))" id="ButtonText" />

从这行代码中,可以非常清楚的看到问题处在什么地方了,在客户端,首先执行的是自定义的javascript,然后在执行验证控件生成的这一段javascript,显然,在这种情况下,验证控件就失去任何意义了。

三、响应控件

知道了问题处在什么地方,就好办了,我的解决办法是:在执行自定义的javascript(return confirm('你确定要提交吗?‘)前 ,就要验证页面中的控件是否符合规则,于是我将ButtonTest的OnClientClick事件修改如下:

<asp:Button ID="ButtonText" runat="server" Text="测试" OnClientClick="if(CheckClientValidate()) return Confirm('你确定要提交页面吗?');" />

CheckClientValidate()方法的代码如下:
<script language="javascript" type="text/javascript">
function CheckClientValidate(){  
   Page_ClientValidate();
   if (Page_IsValid){
   return true;
   }else{
   return false;
   }
 }
</script>

运行,测试。验证控件发挥作用。问题解决。

四、后记

这就是被我已知忽略的问题和解决方案,当我发觉这个问题的时候,冒出了一身冷汗,幸亏做了严格的服务器端验证,不然可就惨了。从这里也可以看出指定严格的服务器端验证是多么的有必要啊:-)。它不仅可以防止”黑客“绕过客户端验证,还可以防止因为自己没有发觉的错误,造成数据的不准确。

注:

Page_ClientValidate(),本函数用于在包含微软验证控件的aspx页面中,根据用户输入操作是否合法,返回True或者False

可直接判断。

 if(Page_ClientValidate())
 {
 return true;
 }
 else
 {
 return false;
 }
Javascript 相关文章推荐
Mootools 1.2教程 排序类和方法简介
Sep 15 Javascript
js本身的局限性 别让javascript做太多事
Mar 23 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
Nov 14 Javascript
js 浏览器事件介绍
Mar 30 Javascript
JS 去前后空格大全(IE9亲测)
Jul 15 Javascript
Javascript中call的两种用法实例
Dec 13 Javascript
微信小程序实现多个按钮的颜色状态转换
Feb 15 Javascript
Vue.js实现tab切换效果
Jul 24 Javascript
JS操作字符串转数字的常见方法示例
Oct 29 Javascript
javascript实现留言板功能
Feb 08 Javascript
详解React的回调渲染模式
Sep 10 Javascript
vue中data里面的数据相互使用方式
Jun 05 Vue.js
快速解决FusionCharts联动的中文乱码问题
Dec 04 #Javascript
js跑步算法的实现代码
Dec 04 #Javascript
如何在JavaScript中实现私有属性的写类方式(二)
Dec 04 #Javascript
如何在JavaScript中实现私有属性的写类方式(一)
Dec 04 #Javascript
JavaScript判断变量是否为undefined的两种写法区别
Dec 04 #Javascript
ExtJS4中使用mixins实现多继承示例
Dec 03 #Javascript
ExtJS4中的requires使用方法示例介绍
Dec 03 #Javascript
You might like
三国漫画《火凤燎原》宣布动画化PV放出 预计2020年播出
2020/03/08 国漫
php读取excel文件的简单实例
2013/08/26 PHP
php中的filesystem文件系统函数介绍及使用示例
2014/02/13 PHP
PHP实现的网站目录扫描索引工具
2016/09/08 PHP
PHP安全之register_globals的on和off的区别
2020/07/23 PHP
js常用代码段收集
2011/10/28 Javascript
一个简单的弹性返回顶部JS代码实现介绍
2013/06/09 Javascript
解析jQuery与其它js(Prototype)库兼容共存
2013/07/04 Javascript
JavaScript中匿名、命名函数的性能测试
2014/09/04 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
JS+CSS实现大气清新的滑动菜单效果代码
2015/10/22 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
JavaScript必知必会(七)js对象继承
2016/06/08 Javascript
Javascript基础_标记文字的实现方法
2016/06/14 Javascript
AngularJS使用拦截器实现的loading功能完整实例
2017/05/17 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
2017/09/03 jQuery
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
2017/11/09 Javascript
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
Python的函数的一些高阶特性
2015/04/27 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
python 统计数组中元素出现次数并进行排序的实例
2018/07/02 Python
python实现Zabbix-API监控
2018/09/17 Python
python中metaclass原理与用法详解
2019/06/25 Python
Python如何优雅获取本机IP方法
2019/11/10 Python
Django实现简单网页弹出警告代码
2019/11/15 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
Python错误的处理方法
2020/06/23 Python
澳大利亚牛仔裤商店:Just Jeans
2016/10/13 全球购物
PHP中如何创建和修改数组
2012/05/02 面试题
工厂保安员岗位职责
2014/01/31 职场文书
企业安全生产责任书
2014/04/14 职场文书
大学生自荐材料范文
2014/12/30 职场文书
财务会计岗位职责
2015/02/03 职场文书
审美与表现自我评价
2015/03/09 职场文书
公司慰问信范文
2015/03/23 职场文书
maven依赖的version声明控制方式
2022/01/18 Java/Android