验证控件与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用户自定义类的类名称的代码
Mar 08 Javascript
IE8提示Invalid procedure call or argument 异常的解决方法
Sep 30 Javascript
js数字转换为float,取N位小数
Feb 08 Javascript
浅谈js的setInterval事件
Dec 05 Javascript
Jquery结合HTML5实现文件上传
Jun 25 Javascript
JS DOM实现鼠标滑动图片效果
Sep 17 Javascript
BootStrap入门教程(三)之响应式原理
Sep 19 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
Mar 09 Javascript
ES6小技巧之代替lodash
Jun 07 Javascript
JS端基于download.js实现图片、视频时直接下载而不是打开预览
May 09 Javascript
Vue结合路由配置递归实现菜单栏功能
Jun 16 Javascript
vue组件讲解(is属性的用法)模板标签替换操作
Sep 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
php预定义变量使用帮助(带实例)
2013/10/30 PHP
64位windows系统下安装Memcache缓存
2015/12/06 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
2016/11/28 PHP
php写app接口并返回json数据的实例(分享)
2017/05/20 PHP
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
IE与FF下javascript获取网页及窗口大小的区别详解
2014/01/14 Javascript
jQuery取得设置清空select选择的文本与值
2014/07/08 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
javascript生成大小写字母
2015/07/03 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
javascript中return,return true,return false三者的用法及区别
2015/11/17 Javascript
jQuery解析json格式数据简单实例
2016/01/22 Javascript
详解js的六大数据类型
2016/12/27 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
nodejs创建简易web服务器与文件读写的实例
2017/09/07 NodeJs
NodeJs 模仿SIP话机注册的方法
2019/06/21 NodeJs
JS数组方法shift()、unshift()用法实例分析
2020/01/18 Javascript
JS中的const命令你真懂它吗
2020/03/08 Javascript
Vue环境搭建+VSCode+Win10的详细教程
2020/08/19 Javascript
JavaScript实现图片合成下载的示例
2020/11/19 Javascript
[42:50]NB vs VP 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
2018/10/15 Python
对Python 除法负数取商的取整方式详解
2018/12/12 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
Python实现分数序列求和
2020/02/25 Python
Pycharm导入anaconda环境的教程图解
2020/07/31 Python
Python实现京东抢秒杀功能
2021/01/25 Python
详解CSS3新增的背景属性
2019/12/25 HTML / CSS
突袭HTML5之Javascript API扩展4—拖拽(Drag/Drop)概述
2013/01/31 HTML / CSS
主治医师岗位职责
2013/12/10 职场文书
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
销售经理工作职责
2014/02/03 职场文书
健康教育评估方案
2014/05/25 职场文书
Java实现房屋出租系统详解
2021/10/05 Java/Android