手机版

防止重复提交只有一次的终极诀窍

时间:2021-11-23 来源:互联网 编辑:宝哥软件园 浏览:

作者:Silent Void来源:http://happyhippy.cnblogs.com/最近一位客户总抱怨每个月总有几笔重复的业务数据;但是,在创建这个业务数据的页面时,我们应用了常规的防重复提交技术,那么为什么呢… 1。常规的防重复提交复制代码如下: ASP : Button Runat=' server ' ID=' BTN postback 1 ' Text=' press me 1 ' usesubmit behavior=' false ' onclient click=' this . disabled=。this . form . submit();”/这里需要注意的是:(1)。UseSubmitBehavior='false ':需要设置为false,这样生成的输入类型就是button;如果默认值为真,则生成的输入类型为提交。回发到服务器不会触发button的服务器端事件。(2).按钮不能有ValidationGroup属性,否则回发到服务器时,不会触发按钮的服务器事件;2.如果页面上使用了Validator控件,继续使用上面的方法,我们会发现Validator控件无效。因为在按钮禁用被删除后,验证器控件将不再用于提交时的验证。为了解决这个问题,一种解决方案是在提交之前手动检查一次。如果我们使用IE Develop工具来跟踪提交的JS代码,我们会发现ASP.NET在Page_ClientValidate函数的Validator中完成了验证集,所以下面这个方法被手动调用了一次。如果验证失败,那么就不要提交:复制代码如下: 1:脚本类型=' text/JavaScript '函数禁用按钮(button) {if(类型为(page _ client validate)=' function ' page _ client validate()==false){ return false;} button.disabled=true返回真;}/script div asp: textbox runat=' server ' ID=' tbxinput 1 '/asp: textbox asp: requiredfieldvalidator ID=' requiredfieldvalidator 1 ' runat=' server ' ControlToValidate=' tbxinput 1 ' validation group=' group 1 '错误消息=' * '/ASP : requiredfieldvalidator ASP : button runat=' server ' ID=' btnpostback 1 ' text='onclick=' btnpostback _ click '/ASP : button/div说明:如果页面上有多个Validator控件,多个按钮需要分组验证,只需要设置按钮的ValidationGroup即可。上面的方法似乎已经很完美了;通常,这是文章的结尾,这是我们的系统是如何使用的。但是.最近总有客户抱怨每个月都有几个重复的业务数据。当用户的点击速度足够快的时候……根据客户的反馈信息,我们查看了重复的业务数据,发现同一条记录偶尔会出现两次,数据库中记录的创建时间正好相等(精确到毫秒)。然后让用户演示她的日常操作模式,发现她点击鼠标的速度相当快。虽然没有重现问题,但我们也大致知道了问题的可能原因:当用户点击速度够快的时候,浏览器还没有来得及禁用按钮,用户第二次点击按钮……为了重现问题,我们做了如下测试:ClickMe

复制代码代码如下:脚本类型='text/javascript '函数disableButton(button) //,validateGroup){ if(类型为(Page _ client validate)=' function ' Page _ client validate()==false){ return false;} button.disabled=true}函数双击(){ var button 1=document。getelementbyid(' btnpostback 1 ');按钮1。onclick();按钮1。onclick();//模拟重复点击2次}/script div asp: textbox runat=' server ' ID=' tbxinput 1 '/asp: textbox asp: requiredfieldvalidator ID=' requiredfieldvalidator 1 ' runat=' server ' ControlToValidate=' tbxinput 1 '验证组=' group 1 '错误消息=' * '/asp3: requiredfieldvalidator asp: button runat=' server ' ID=' btnpostback 1 ' Text='按我1 ' usesubmit行为=' false '验证组=' group 1 ' OnClientClick=' disable button(此);OnClick=' btnPostBack _ Click '/ASP :按钮/div输入类型=' button ' OnClick='双击();'值='点击一次,模拟连续点击'按我1'两次'/然后页面后台代码如下:复制代码代码如下:公共静态int I=0;受保护的void btnPostBack_Click(对象发送者,事件参数{回应.写(((按钮)发送者)。文本’(一)10 .ToString());//将累加结果输出} 每次页面回发时,全局变量1,如果连续回发两次,则得到的是2的累计。测试的结果:除了偶尔1,大部分情况都是累加2……看来,如果用户点击鼠标的速度足够快,前面2中的办法还是无法杜绝重复提交,咋办呢?

4. 终极绝杀技
ClickMe2

处理思路就是,用数组记录用户的点击时间,如果点击时间小于某个时间间隔(下面演示的一秒,即1000毫秒),则认为是重复提交,并取消当前点击事件,直接上代码了:复制代码代码如下: html xmlns=' http://www。w3。org/1999/XHTML ' head runat=' server '脚本类型=' text/JavaScript ' var date=new Array();函数禁用按钮(按钮,验证组){日期。推送(新日期());如果(日期。长度1(日期[日期。长度-1]).getTime() - date[date.length - 2].getTime() 1000))//小于一秒则认为重复提交{ event . cancelubble=true//测试时发现,如果直接单独设置cancelBubble、或者返回值来取消事件,经常取消不了,依然存在重复提交的可能。因此只好用返回值来实现手工控制!返回false} if(类型为(Page _ client validate)=' function '((validate group==)未定义的page _ client validate()==false)| |(验证组!=未定义的Page _ client validate(验证组)==false)){//如果指定了验证组,则只验证改组;如果未指定,则验证全部验证控件返回false}按钮,disabled=true返回真;}函数双击(){ var button 1=document。getelementbyid(' btnpostback 1 ');按钮1。onclick();按钮1。onclick();}/脚本/标题正文表单ID=' form ' runat=' server ' div asp: textbox runat=' server ' ID=' tbxInput1 '/asp3360 textbox asp: requiredfieldvalidator ID=' requiredfieldvalidator 1 ' runat=' server ' ControlToValidate=' tbxInput1 '验证组='组1 '错误消息=' */asp: requiredfieldvalidator asp:按钮runat='按我1 ' UseSubmitBehavior=' false '验证组=' GrouP 1 ' OnClientClick=' if(!disableButton(此为“组1”))返回false ' onclick=' btnPostBack _ Click '/asp: button/div asp: textbox runat=' server ' ID=' tbxInput2 '/asp: textbox asp: requiredfieldvalidator ID=' requiredfieldvalidator 2 ' runat=' server ' ControlToValidate=' tbxInput2 '验证组=' group 2 '错误消息=' */asp: requiredfieldvalidator asp: button按我2 ' UseSubmitBehavior=' false ' OnClientClick=' if(!'禁用按钮(这个))返回false ' onclick=' btnPostBack _ Click '/ASP :按钮/div输入类型=“按钮”OnClick=“双击();”值='点击一次,模拟连续点击'按我1'两次//表单/正文/html说明: (1).测试时发现,如果直接单独设置cancelBubble、或者返回值来取消事件,经常取消不了,依然存在高频率的重复提交。因此只好用返回值来实现手工控制;(2).禁用按钮接收一个验证组参数,如果指定了验证组,则只验证改组;如果未指定,则验证全部验证控件。

版权声明:防止重复提交只有一次的终极诀窍是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。