验证控件与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 相关文章推荐
Javascript 个人笔记(没有整理,很乱)
Jul 07 Javascript
javascript prototype,executing,context,closure
Dec 24 Javascript
浅析JavaScript中的typeof运算符
Nov 30 Javascript
javascript 用函数语句和表达式定义函数的区别详解
Jan 06 Javascript
Javascript函数式编程语言
Oct 11 Javascript
AngularJS监听路由变化的方法
Mar 07 Javascript
微信小程序动态显示项目倒计时效果
Jun 13 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
Jul 18 Javascript
CKeditor4 字体颜色功能配置方法教程
Jun 26 Javascript
微信小程序自定义组件实现环形进度条
Nov 17 Javascript
解决vue watch数据的方法被调用了两次的问题
Nov 07 Javascript
JavaScript文档对象模型DOM
Nov 20 Javascript
快速解决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
适用于php-5.2 的 php.ini 中文版[金步国翻译]
2011/04/17 PHP
PHP分页详细讲解(有实例)
2013/10/30 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
2017/08/04 PHP
用JavaScript仿PS里的羽化效果代码
2011/12/20 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
AngularJS中的模块详解
2015/01/29 Javascript
Javascript 5种方法实现过滤删除前后所有空格
2016/06/22 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
vue项目tween方法实现返回顶部的示例代码
2018/03/02 Javascript
vue.js实现的绑定class操作示例
2018/07/06 Javascript
vue展示dicom文件医疗系统的实现代码
2018/08/27 Javascript
微信小程序单选radio及多选checkbox按钮用法示例
2019/04/30 Javascript
vue router动态路由设置参数可选问题
2019/08/21 Javascript
Vue 实现把表单form数据 转化成json格式的数据
2019/10/29 Javascript
基于JavaScript实现猜数字游戏代码实例
2020/07/30 Javascript
python实现爬取千万淘宝商品的方法
2015/06/30 Python
python轻松查到删除自己的微信好友
2016/01/10 Python
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
python学习之编写查询ip程序
2016/02/27 Python
Pandas之drop_duplicates:去除重复项方法
2018/04/18 Python
python实现对指定输入的字符串逆序输出的6种方法
2018/04/26 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
Python while true实现爬虫定时任务
2020/06/08 Python
巴黎欧莱雅法国官网:L’Oreal Paris
2019/04/30 全球购物
彪马土耳其官网:PUMA土耳其
2019/07/14 全球购物
优质有机椰子产品:Dr. Goerg
2019/09/24 全球购物
计算机专业毕业生自荐信
2013/12/31 职场文书
青年教师培训方案
2014/02/06 职场文书
土木工程专业本科生求职信
2014/10/01 职场文书
老人与海读书笔记
2015/06/26 职场文书
董事长致辞
2015/07/29 职场文书
生活委员竞选稿
2015/11/21 职场文书
Redis 常见使用场景
2021/08/30 Redis
MYSQL 运算符总结
2021/11/11 MySQL