验证控件与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数组深拷贝和浅拷贝的两种方法
Apr 16 Javascript
教你用javascript实现随机标签云效果_附代码
Mar 16 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
Jul 07 Javascript
第一次接触神奇的Bootstrap
Oct 14 Javascript
jQuery焦点图左右转换效果
Dec 12 Javascript
JavaScript中变量提升与函数提升经典实例分析
Jul 26 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
Jan 23 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
May 22 Javascript
深入浅出了解Node.js Streams
May 27 Javascript
vue.js实现三级菜单效果
Oct 19 Javascript
Vue SPA 初次进入加载动画实现代码
Nov 14 Javascript
详解vue修改elementUI的分页组件视图没更新问题
Nov 13 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 eval函数用法 PHP中eval()函数小技巧
2012/10/31 PHP
php计算当前程序执行时间示例
2014/04/24 PHP
thinkphp框架使用JWTtoken的方法详解
2019/10/10 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
nodejs 后缀名判断限制代码
2011/03/31 NodeJs
js处理json以及字符串的比较等常用操作
2013/09/08 Javascript
JS动态添加Table的TR,TD实现方法
2015/01/28 Javascript
Js控制滑轮左右滑动实例
2015/02/13 Javascript
JavaScript返回网页中锚点数目的方法
2015/04/03 Javascript
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
javascript实现五星评分功能
2015/11/10 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
2016/09/24 Javascript
基于vue2的table分页组件实现方法
2017/03/20 Javascript
easyUI下拉列表点击事件使用方法
2017/05/18 Javascript
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
Vue双向绑定实现原理与方法详解
2020/05/07 Javascript
Python中扩展包的安装方法详解
2017/06/14 Python
Python装饰器原理与简单用法实例分析
2018/04/29 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
pandas的to_datetime时间转换使用及学习心得
2019/08/11 Python
python脚本后台执行方式
2019/12/21 Python
Python如何输出百分比
2020/07/31 Python
CSS3 实现弹幕的示例代码
2017/08/07 HTML / CSS
微软澳洲官方网站:Microsoft Australia
2017/01/10 全球购物
意大利会呼吸的鞋:Geox健乐士
2017/02/12 全球购物
Bibloo罗马尼亚网站:女装、男装、童装及鞋子和配饰
2019/07/20 全球购物
Vrbo英国:预订度假屋
2020/08/19 全球购物
五型班组建设方案
2014/02/10 职场文书
反对形式主义、官僚主义、享乐主义和奢靡之风整改措施
2014/09/17 职场文书
个人政风行风自查自纠报告
2014/10/21 职场文书
2014年大班保育员工作总结
2014/12/02 职场文书
监考失职检讨书
2015/01/26 职场文书
医院保洁员岗位职责
2015/02/13 职场文书
社会心理学学习心得体会
2016/01/22 职场文书
Java集成swagger文档组件
2021/06/28 Java/Android
MySQL示例讲解数据库约束以及表的设计
2022/06/16 MySQL