简单实用的防止多次提交辅助类

简介:

一:  开题

    这篇只是一个简单的应用技巧,高手请跳过,别拍砖,打击我这个有激情的菜鸟。在我们的web项目中经常会遇见由于网络原为等问题,而导致在页面提高后,服务器还没有来得及返回的时候,我们的用户可能在此点击按钮使的数据多次的提交。防止这个行为很简单,我们一般经常是在按钮点击后使其禁用disabled=true。我是一个很懒的人(生活中并不懒,只是写Code比较懒,我的目标是:少写Code,基于配置而不写Code是最好的3]6GJ(EWN[K2P[Z6B`6B`2H )。所以就有了这个简单的辅助类:我的思路是在page的PreRender时间中注册提交前执行的脚本全部提交按钮的disabled=true(  page.ClientScript.RegisterOnSubmitStatement()。)等待服务器返回时会更具返回浏览器会重绘,所以我们的设置此时已经无用了。呵呵就这面简单。但是为不少写代码,那些了一个辅助类DoubleSubmitPrevent,提供的几种方式自动按照按钮,或者是手动添加按钮(取决于IsAutoFind),自动查找的起点默认为page,但是为了效率你可以自己设置BaseContrlForFind,关于需要禁止的按钮的判断为IsPreventControl你可以自己定义覆盖默认的,默认为:

复制代码
ExpandedBlockStart.gif 代码
private  System.Predicate < System.Web.UI.Control >  isPreventControl  =  t  =>  (t  is  System.Web.UI.WebControls.Button)  ||  
                       (t 
is  System.Web.UI.WebControls.LinkButton)  ||  
                       (t 
is  System.Web.UI.WebControls.ImageButton)  ||  
                       (t 
is  System.Web.UI.HtmlControls.HtmlButton)  ||  
           
// (t is System.Web.UI.HtmlControls.HtmlLink) || 
                       (t  is  System.Web.UI.HtmlControls.HtmlInputButton)  ||  
                       (t 
is  System.Web.UI.HtmlControls.HtmlInputSubmit); 
复制代码

 

如果你还是觉得效率不好那么,你就可以自己Add或者AddRange,同时包括了Remove,Insert等方法,这一系列方法都支持链式操作(这是第一次使用jQuery的时候给我的最大触动)。例如:dsp.Add(Button1).Add(Button2).Add(Button3).Add(LinkButton1).Add(LinkButton2) =dsp.AddRange(Button1,Button2,Button3,LinkButton1,LinkButton2);包括的多个重载;

  二: Code部分

说了这么多还是直接上代码:

代码

  三: 测试:

为了模拟延时,我在后台加了睡眠:

复制代码
ExpandedBlockStart.gif 代码
protected   void  Page_Load( object  sender, EventArgs e) 
   { 
       
if  (IsPostBack) 
       { 
           System.Threading.Thread.Sleep(
1000   *   5 ); 
           TextBox1.Text 
=  DateTime.Now.ToString(); 
           Button3.Enabled 
=   false
       } 
       Wolf.Utils.DoubleSubmitPrevent dsp 
=   new  Wolf.Utils.DoubleSubmitPrevent( this ) { IsAutoFind  =   true , BaseContrlForFind  =   this .form1 }; 
       
// dsp.Add(Button1).Add(Button2).Add(Button3).Add(LinkButton1).Add(LinkButton2); 
       
   } 
复制代码

 前台html(乱托乱扔的,看来是比较懒8{U`QQB5X27@C_FO](KQ(4G ):

复制代码
ExpandedBlockStart.gif 代码
< form id = " form1 "  runat = " server " >  
    
< asp:TextBox ID = " TextBox1 "  runat = " server " ></ asp:TextBox >  
    
< asp:Button ID = " Button1 "  runat = " server "  Text = " Button "  Enabled = " false "   />  
     
< asp:Button ID = " Button2 "  runat = " server "  Text = " Button "   />  
      
< asp:Button ID = " Button3 "  runat = " server "  Text = " Button "   />  
    
< asp:LinkButton ID = " LinkButton1 "  runat = " server " > LinkButton </ asp:LinkButton >< asp:LinkButton 
        ID
= " LinkButton2 "  runat = " server " > LinkButton </ asp:LinkButton >  
    
</ form >

复制代码

效果:

F]KRP2ZDF95F1FSZ)L57(NN

如果你又更好的方案,也希望能给我分享,请大家多多指教。


本文转自破狼博客园博客,原文链接:http://www.cnblogs.com/whitewolf/archive/2010/11/19/1881991.html,如需转载请自行联系原作者

目录
相关文章
|
20天前
|
运维 Devops
云效产品使用报错问题之代码域修改配置后,删除了代码组,代码未删除,但是项目现在看不到了,如何解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
7月前
27activiti - 流程变量(查询历史的流程变量)
27activiti - 流程变量(查询历史的流程变量)
30 0
|
7月前
|
Java 数据库 开发者
自动配置要点解读
自动配置要点解读
|
10月前
|
缓存 小程序 API
小程序:浅谈小程序更新机制,发版后多久能全覆盖
小程序:浅谈小程序更新机制,发版后多久能全覆盖
267 0
定义一个事件需要单独新建一个文件吗?底层原理是什么?
定义一个事件需要单独新建一个文件吗?底层原理是什么?
|
Java 编译器 Scala
主构造器和辅助构造器的细节|学习笔记
快速学习主构造器和辅助构造器的细节。
94 0
|
容器
任务的批量提交invokeAll两种方法的区别
任务的批量提交invokeAll两种方法的区别
206 0
|
SQL JSON 测试技术
笔记-类型及提交注入
类型及提交注入
62 0
|
JavaScript 前端开发
前端案例:我的备忘录(支持事件的增加、删除和修改,代码完整)
前端案例:我的备忘录(支持事件的增加、删除和修改,代码完整)
221 0
前端案例:我的备忘录(支持事件的增加、删除和修改,代码完整)
|
数据库 C#
根据数据库记录动态生成C#类及其公共属性并动态执行的解决方案
原文:根据数据库记录动态生成C#类及其公共属性并动态执行的解决方案 问题: C#中,想动态产生这么一个类:public class StatisticsData    {        public string ord...
948 0