验证控件与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五图轮播切换实用版
Aug 17 Javascript
jquery实现智能感知连接外网搜索
May 21 Javascript
js showModalDialog弹出窗口实例详解
Jan 07 Javascript
用svg制作富有动态的tooltip
Jul 17 Javascript
jQuery查找节点方法完整实例
Sep 13 Javascript
利用Node.js对文件进行重命名
Mar 12 Javascript
vue-cli+webpack在生成的项目中使用bootstrap实例代码
May 26 Javascript
浅谈vue.js中v-for循环渲染
Jul 26 Javascript
利用CDN加速react webpack打包后的文件详解
Feb 22 Javascript
新手快速入门JavaScript装饰者模式与AOP
Jun 24 Javascript
关于layui 下拉列表的change事件详解
Sep 20 Javascript
JS实现简单控制视频播放倍速的实例代码
Apr 18 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
Web程序工作原理详解
2014/12/25 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
php基于CodeIgniter实现图片上传、剪切功能
2016/05/14 PHP
PHP基本语法实例总结
2016/09/09 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
2019/04/02 PHP
Yii框架参数配置文件params用法实例分析
2019/09/11 PHP
javascript获取网页中指定节点的父节点、子节点的方法小结
2013/04/24 Javascript
javascript 实现 秒杀,团购 倒计时展示的记录 分享
2013/07/12 Javascript
javascript替换已有元素replaceChild()使用介绍
2014/04/03 Javascript
JavaScript实现的购物车效果可以运用在好多地方
2014/05/09 Javascript
jQuery setTimeout传递字符串参数报错的解决方法
2014/06/09 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
2015/08/13 Javascript
Google 地图API Map()构造器详解
2016/08/06 Javascript
jQuery插件echarts去掉垂直网格线用法示例
2017/03/03 Javascript
Angular X中使用ngrx的方法详解(附源码)
2017/07/10 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
前端Vue项目详解--初始化及导航栏
2019/06/24 Javascript
原生js实现日历效果
2020/03/02 Javascript
[01:09:20]NB vs NAVI Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
python使用在线API查询IP对应的地理位置信息实例
2014/06/01 Python
jupyter notebook读取/导出文件/图片实例
2020/04/16 Python
CSS3 translate导致字体模糊的实例代码
2019/08/30 HTML / CSS
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
耐克波兰官方网站:Nike波兰
2019/09/03 全球购物
《蒙娜丽莎之约》教学反思
2014/02/27 职场文书
幼儿园中班教师寄语
2014/04/03 职场文书
社团活动总结
2014/04/28 职场文书
个人委托书
2014/07/31 职场文书
个人年终总结结尾
2015/03/06 职场文书
辩护词格式
2015/05/22 职场文书
2016党员学习作风建设心得体会
2016/01/21 职场文书
MySQL分库分表详情
2021/09/25 MySQL
Python利用capstone实现反汇编
2022/04/06 Python
在Docker容器中部署SQL Server
2022/04/11 Servers