验证控件与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 相关文章推荐
几行代码轻松搞定jquery实现flash8类似的连接效果
May 03 Javascript
js静态方法与实例方法分析
Jul 04 Javascript
js带按钮的提示框可供选择示例代码
Sep 17 Javascript
jQuery获取节点和子节点文本的方法
Jul 22 Javascript
js实现搜索框关键字智能匹配代码
Mar 26 Javascript
JavaScript数据结构与算法之栈与队列
Jan 29 Javascript
vue中mint-ui环境搭建详细介绍
Apr 06 Javascript
JS实现的ajax和同源策略(实例讲解)
Dec 01 Javascript
微信小程序数据存储与取值详解
Jan 30 Javascript
bootstrap中selectpicker下拉框使用方法实例
Mar 22 Javascript
JavaScript队列结构Queue实现过程解析
Mar 07 Javascript
详解ES6新增字符串扩张方法includes()、startsWith()、endsWith()
May 12 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开发微信支付获取用户地址
2015/10/04 PHP
PHP中静态变量的使用方法实例分析
2016/12/01 PHP
jquery 常用操作整理 基础入门篇
2009/10/14 Javascript
ExtJS TabPanel beforeremove beforeclose使用说明
2010/03/31 Javascript
js 浏览器事件介绍
2012/03/30 Javascript
jquery 中多条件选择器,相对选择器,层次选择器的区别
2012/07/03 Javascript
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
javascript常用方法总结
2015/05/14 Javascript
JS给Textarea文本框添加行号的方法
2015/08/20 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
js正则表达式验证表单【完整版】
2017/03/06 Javascript
使用ES6语法重构React代码详解
2017/05/09 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
实例讲解DataTables固定表格宽度(设置横向滚动条)
2017/07/11 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
2017/08/24 Javascript
Validform验证时可以为空否则按照指定格式验证
2017/10/20 Javascript
五步轻松实现JavaScript HTML时钟效果
2020/03/25 Javascript
TypeScript 引用资源文件后提示找不到的异常处理技巧
2020/07/15 Javascript
[01:59]翻天覆地,因你而变,7.20版本地图更新速览
2018/11/24 DOTA
Pthon批量处理将pdb文件生成dssp文件
2015/06/21 Python
python tkinter界面居中显示的方法
2018/10/11 Python
python操作日志的封装方法(两种方法)
2019/05/23 Python
python实现批量修改服务器密码的方法
2019/08/13 Python
在Python中字典按值排序的实现方法
2020/11/12 Python
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
HTML5网页录音和上传到服务器支持PC、Android,支持IOS微信功能
2019/04/26 HTML / CSS
枚举与#define宏的区别
2014/04/30 面试题
日语专业推荐信
2013/11/12 职场文书
学雷锋志愿服务月活动总结
2014/03/09 职场文书
实习评语大全
2014/04/26 职场文书
2015年元旦活动总结
2014/05/09 职场文书
公司年终奖分配方案
2014/06/16 职场文书
公司人事专员岗位职责
2014/08/11 职场文书
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
2022/04/12 MySQL
Windows Server 修改远程桌面端口的实现
2022/06/25 Servers