验证控件与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 相关文章推荐
通过DOM脚本去设置样式信息
Sep 19 Javascript
javascript学习笔记(五)正则表达式
Apr 08 Javascript
jquery实现加载等待效果示例
Sep 25 Javascript
JQuery弹出炫丽对话框的同时让背景变灰色
May 22 Javascript
javascript实现左右控制无缝滚动
Dec 31 Javascript
js中unicode转码方法详解
Oct 09 Javascript
js如何改变文章的字体大小
Jan 08 Javascript
php输出全部gb2312编码内的汉字方法
Mar 04 Javascript
js学习总结之dom2级事件基础知识详解
Jul 27 Javascript
微信小程序自定义带价格显示日历效果
Dec 29 Javascript
angular多语言配置详解
May 16 Javascript
使用layui实现树形结构的方法
Sep 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静态类
2006/11/25 PHP
PHP一些有意思的小区别
2006/12/06 PHP
discuz Passport 通行证 整合笔记
2008/06/30 PHP
PHP爆绝对路径方法收集整理
2012/09/17 PHP
解析yii数据库的增删查改
2013/06/20 PHP
PHP实现的购物车类实例
2015/06/17 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
javascript下数值型比较难点说明
2010/06/07 Javascript
JavaScript arguments 多参传值函数
2010/10/24 Javascript
事件绑定之小测试  onclick &amp;&amp; addEventListener
2011/07/31 Javascript
JavaScript可否多线程? 深入理解JavaScript定时机制
2012/05/23 Javascript
thinkphp中常用的系统常量和系统变量
2014/03/05 Javascript
JSON 的正确用法探讨:Pyhong、MongoDB、JavaScript与Ajax
2016/05/15 Javascript
vue的Virtual Dom实现snabbdom解密
2017/05/03 Javascript
JS创建Tag标签的方法详解
2017/06/09 Javascript
input输入框内容实时监测(附代码)
2017/08/15 Javascript
详解基于vue-router的动态权限控制实现方案
2017/09/28 Javascript
AngularJs 禁止模板缓存的方法
2017/11/28 Javascript
Vue.directive 自定义指令的问题小结
2018/03/04 Javascript
Vuex持久化插件(vuex-persistedstate)解决刷新数据消失的问题
2019/04/16 Javascript
js使用cookie实现记住用户名功能示例
2019/06/13 Javascript
vue-router 路由传参用法实例分析
2020/03/06 Javascript
Python中selenium实现文件上传所有方法整理总结
2017/04/01 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
使用Django连接Mysql数据库步骤
2019/01/15 Python
python中类的输出或类的实例输出为这种形式的原因
2019/08/12 Python
Python实现获取当前目录下文件名代码详解
2020/03/10 Python
对python中arange()和linspace()的区别说明
2020/05/03 Python
Ruby如何进行文件操作
2014/07/17 面试题
离职保密承诺书
2014/05/28 职场文书
2014年业务员工作总结范文
2014/11/17 职场文书
民事申诉状范本
2015/05/20 职场文书
小学语文教师研修感悟
2015/11/18 职场文书
高三语文教学反思
2016/02/16 职场文书