验证控件与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 相关文章推荐
js电信网通双线自动选择技巧
Nov 18 Javascript
json 入门基础教程 推荐
Oct 31 Javascript
有关JavaScript的10个怪癖和秘密分享
Aug 28 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
Mar 01 Javascript
js获取html文件的思路及示例
Sep 17 Javascript
jquery数组之存放checkbox全选值示例代码
Dec 20 Javascript
JavaScript设计模式之外观模式实例
Oct 10 Javascript
javascript实现分栏显示小技巧附图
Oct 13 Javascript
jQuery检查事件是否触发的方法
Jun 26 Javascript
微信小程序数据分析之自定义分析的实现
Aug 17 Javascript
在vue中解决提示警告 for循环报错的方法
Sep 28 Javascript
Vuex mutitons和actions初使用详解
Mar 04 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
十大“创意”战术!
2020/03/04 星际争霸
一步一步学习PHP(4) php 函数 补充2
2010/02/15 PHP
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
2013/08/07 PHP
php多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
php 魔术常量详解及实例代码
2016/12/04 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
jQuery select控制插件
2009/08/17 Javascript
xheditor与validate插件冲突的解决方案
2010/04/15 Javascript
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
js读取被点击次数的简单实例(从数据库中读取)
2014/03/07 Javascript
js选择并转移导航菜单示例代码
2014/08/19 Javascript
浅谈JavaScript Date日期和时间对象
2014/12/29 Javascript
个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
2015/06/10 Javascript
javascript基础练习之翻转字符串与回文
2017/02/20 Javascript
Angular4 反向代理Details实践
2018/05/30 Javascript
[05:06]2017亚洲邀请赛DAC回顾片
2017/04/19 DOTA
[43:41]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
Python爬虫之pandas基本安装与使用方法示例
2018/08/08 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
使用Python实现音频双通道分离
2020/12/25 Python
Coach澳大利亚官方网站:美国著名时尚奢侈品牌
2017/05/24 全球购物
英语教研活动总结
2014/07/02 职场文书
反腐倡廉警示教育活动心得体会
2014/09/04 职场文书
煤矿安全保证书
2015/02/27 职场文书
2015年财政局工作总结
2015/05/21 职场文书
同意离婚答辩状
2015/05/22 职场文书
运动会跳远广播稿
2015/08/19 职场文书
Nginx进程调度问题详解
2021/09/25 Servers
Win11怎么进入安全模式?Windows 11进入安全模式的方法
2021/11/21 数码科技
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers
从结婚开始的恋爱故事。小说《我的美好婚事》TV动画化决定
2022/04/07 日漫