验证控件与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 相关文章推荐
小议Function.apply() 之一------(函数的劫持与对象的复制)
Nov 30 Javascript
jquery load事件(callback/data)使用方法及注意事项
Feb 06 Javascript
jqueyr判断checkbox组的选中(示例代码)
Nov 08 Javascript
浅谈JavaScript Date日期和时间对象
Dec 29 Javascript
使用jQuery实现返回顶部
Jan 26 Javascript
JavaScript中的toLocaleDateString()方法使用简介
Jun 12 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
Jun 12 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
Oct 10 Javascript
vue如何从接口请求数据
Jun 22 Javascript
深入理解react-router 路由的实现原理
Sep 26 Javascript
通过实例解析JavaScript for in及for of区别
Jun 15 Javascript
vue中如何自定义右键菜单详解
Dec 08 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
用Zend Encode编写开发PHP程序
2006/10/09 PHP
2014最热门的24个php类库汇总
2014/12/18 PHP
php关联数组快速排序的方法
2015/04/17 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
2019/05/06 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
jquery 实现的全选和反选
2009/04/15 Javascript
js中设置元素class的三种方法小结
2011/08/28 Javascript
js动画(animate)简单引擎代码示例
2012/12/04 Javascript
jQuery读取和设定KindEditor值的方法
2013/11/22 Javascript
javascript单引号和双引号的区别和处理
2014/05/14 Javascript
js实现时间显示几天前、几小时前或者几分钟前的方法集锦
2015/05/29 Javascript
浅谈JavaScript中的作用域和闭包问题
2015/07/07 Javascript
Extjs 点击复选框在表格中增加相关信息行
2016/07/12 Javascript
JS获取浮动(float)元素的style.left值为空的快速解决办法
2017/02/19 Javascript
TypeScript入门-接口
2017/03/30 Javascript
深入理解Vue官方文档梳理之全局API
2017/11/22 Javascript
vue进行图片的预加载watch用法实例讲解
2018/02/07 Javascript
Vue 使用中的小技巧
2018/04/26 Javascript
js for终止循环 跳出多层循环
2018/10/04 Javascript
微信小程序iOS下拉白屏晃动问题解决方案
2019/10/12 Javascript
javascript canvas时钟模拟器
2020/07/13 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
python实现决策树、随机森林的简单原理
2018/03/26 Python
Python3多目标赋值及共享引用注意事项
2019/05/27 Python
复化梯形求积分实例——用Python进行数值计算
2019/11/20 Python
Python enumerate() 函数如何实现索引功能
2020/06/29 Python
pycharm如何设置官方中文(如何汉化)
2020/12/29 Python
Python绘制K线图之可视化神器pyecharts的使用
2021/03/02 Python
高中生学习生活的自我评价
2013/11/27 职场文书
清洁员岗位职责
2015/02/15 职场文书
vue引入Excel表格插件的方法
2021/04/28 Vue.js
Mysql systemctl start mysqld报错的问题解决
2021/06/03 MySQL
CSS实现切角+边框+投影+内容背景色渐变效果
2021/11/01 HTML / CSS
Python的三个重要函数详解
2022/01/18 Python
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL