一:  开题

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

代码

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部分

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

namespace Wolf.Utils 

    public class DoubleSubmitPrevent 
    { 
        private System.Collections.Generic.List<string> _clientIDList = null; 
        private const string DOUBLE_SUBMIT_PREVENT_STR = "B3F6F682-F404-4519-9F30-79876E5A5C9A_WOLF_DOUBLESUBMITPREVENT_391B8D4F-757E-4005-8262-062652D8BAC6"; 
        private bool isAutoFind = false; 
        #region judje  Prevent Control? 
        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); 
        #endregion 
        private System.Web.UI.Control baseContrlForFind = null;

/// <summary> 
        /// Auto Find will satrt with this Control;Default this Page . 
        /// </summary> 
        public System.Web.UI.Control BaseContrlForFind 
        { 
            get { return baseContrlForFind; } 
            set { baseContrlForFind = value; } 
        }

/// <summary> 
        /// judje the Contrl that be prevented; 
        /// </summary> 
        public System.Predicate<System.Web.UI.Control> IsPreventControl 
        { 
            get { return isPreventControl; } 
            set { isPreventControl = value; } 
        } 
        /// <summary> 
        /// Auto Find the Control that be prevented ? 
        /// </summary> 
        public bool IsAutoFind 
        { 
            get { return isAutoFind; } 
            set { isAutoFind = value; } 
        }

public DoubleSubmitPrevent(System.Web.UI.Page page) 
        { 
            _clientIDList = new System.Collections.Generic.List<string>(); 
            baseContrlForFind = page; 
            page.PreRenderCompleted += new System.EventHandler(DoubleSubmitPreventPagePreRenderHick); 
        }

public DoubleSubmitPrevent Add(string clientID) 
        { 
            _clientIDList.Add(clientID); 
            return this; 
        } 
        public DoubleSubmitPrevent Add(System.Web.UI.Control ctr) 
        { 
            _clientIDList.Add(ctr.ClientID); 
            return this; 
        }

public DoubleSubmitPrevent AddRange(params string[] clientIDs) 
        { 
            _clientIDList.AddRange(clientIDs); 
            return this; 
        }

public DoubleSubmitPrevent AddRange(params System.Web.UI.Control[] ctrs) 
        { 
            foreach (var item in ctrs) 
            { 
                Add(item); 
            } 
            return this; 
        }

public DoubleSubmitPrevent Remove(string clientID) 
        { 
            _clientIDList.Remove(clientID); return this; 
        }

public DoubleSubmitPrevent Remove(System.Web.UI.Control ctr) 
        { 
            _clientIDList.Remove(ctr.ClientID); 
            return this; 
        }

public bool Exists(string clientID) 
        { 
            return _clientIDList.Exists(t => t.Equals(clientID)); 
        }

public bool Exists(System.Web.UI.Control ctr) 
        { 
            return _clientIDList.Exists(t => t.Equals(ctr.ClientID)); 
        }

protected virtual void DoubleSubmitPreventPagePreRenderHick(object sender, System.EventArgs e) 
        { 
            System.Web.UI.Page page = sender as System.Web.UI.Page; 
            if (page != null) 
            {

if (isAutoFind) 
                { 
                    #region Find Action 
                    System.Action<System.Collections.Generic.List<string>, System.Web.UI.Control> action = null; 
                    action = (list, ctr) => 
                    { 
                        if (ctr != null) 
                        { 
                            if (isPreventControl(ctr)) 
                            { 
                                list.Add(ctr.ClientID); 
                            } 
                            foreach (System.Web.UI.Control item in ctr.Controls) 
                            { 
                                action(list, item); 
                            } 
                        }

}; 
                    #endregion 
                    action(_clientIDList, baseContrlForFind);

}

System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
                foreach (var item in _clientIDList) 
                { 
                    sb.Append(string.Format(" document.getElementById(\"{0}\").disabled=true;", item)); 
                } 
                page.ClientScript.RegisterOnSubmitStatement(this.GetType(), DOUBLE_SUBMIT_PREVENT_STR, sb.ToString()); 
            } 
        } 
    } 
}

三: 测试:

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

代码

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(乱托乱扔的,看来是比较懒):

代码

<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>

效果:

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

作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客、博客园--破狼和51CTO--破狼。http://www.cnblogs.com/whitewolf/archive/2010/11/19/1881991.html

简单实用的防止多次提交辅助类相关推荐

  1. html美化select样式,select样式美化(简单实用)

    美化select,可以实用一个a标签将select嵌套进去,然后将相对定位,在将select绝对定位,美化即可 .sel_mask{ /*将相对定位*/ position:relative; widt ...

  2. 如何获取投票提交地址_简单实用 | 2019全国医院擂台赛投票攻略(县域版)

    作者:用户大当家 2019改善医疗服务行动全国医院擂台赛案例征集环节结束.截止8月15日24时,城市组提交案例2196个,县域组提交案例1087个,总计3283个案例,数量再度创纪录. 首先为积极改善 ...

  3. 用aspnetpager实现datalist分页(绝对的简单实用)

    微软的Datalist在做电子相册时候必不可少,但是不支持分页功能,都出到2008了还是没有分页功能,幸好网上有个专业的分页空间aspnetpager,帮我们解决了大问题,说实在话的,网上关于data ...

  4. Android客户端连接服务器- OKHttp的简单实用方法

    文章目录 一 .OKHttp简介 二. OkHttp3使用 1.创建HTTPClient实例 2.Get请求 3.POST请求 三.Timeouts(超时) **写在前面:本文只是对OKHttp3的简 ...

  5. 实用计算机计算方法,科学的方法:最简单实用的计算机功率计算方法

    PC电源作为计算机的核心组件,在购买时对于许来说非常重要. 但是,许也对自己的计算机需要配备多少电源存有疑问. 由于电源方面的权威材料和指导性文章很少,因此大多数人对电源选择感到困惑. 恐怕许最安全的 ...

  6. jcrop java_[Java教程]Jcrop简单实用

    [Java教程]Jcrop简单实用 0 2014-05-06 12:00:10 今天有一个项目的功能需求 "在上传照片的时候能进行裁剪",网上找了下,发现有Jcrop这款插件,自己 ...

  7. 多功能工具箱微信小程序源码下载-操作简单实用流量主小程序

    这是一款多功能工具箱小程序! 目前由N款小功能组合成 比如: 图片拼接 九宫格切图 透明昵称 文字表情 等等上面说的只是一部分 该款小程序无需服务器与域名 使用微信开发者工具打开文件然后上传提交审核即 ...

  8. 一个简单实用的,基于EF的三层架构

    到底什么样的框架才是好框架呢?或许不同人有不同的看法.我个人觉一个好的框架,最重要的要是简单实用,能快速适开发,可维护性高(不会出现复制黏贴的代码),并能快速响应各种业务场景的变化的框架,同时性能不会 ...

  9. html 可调节进度条控件,jQuery简单实用的轻量级进度条插件

    jQMeter是一款简单实用的轻量级进度条jQuery插件,它可以显示为水平或垂直进度条,进度条加载时带有动画特效,你只需要简单的传入一些参数到jQMeter对象的构造函数中就可以完成你想要的进度条效 ...

  10. 分享几个用 Python 给图片添加水印的方法,简单实用

    作者 |俊欣 来源 |关于数据分析与可视化 今天来分享几种可以给图片添加水印的方法,都是十分的简单实用,大家在看了之后也可以私底下去自己试试,有些方法需要的代码量就比较少,有些方法需要的代码量就稍微多 ...

最新文章

  1. include和require的区别
  2. golang内置类型和函数
  3. Java文件删除操作File#delete()
  4. vuedraggable示例_vue拖拽列表vuedraggable
  5. 关于Spring的构造函数,init-method,和依赖注入的先后顺序
  6. 必须重视数据中心的规划设计
  7. PyCharm3.0默认快捷键
  8. 【转】华为的面试题目(有兴趣的进来看看)
  9. linux 正则表达式与实践
  10. 使用Ehcache+Redis实现分布式缓存
  11. 【相对/绝对路径】JavaWeb项目中,请求转发与重定向的路径写法
  12. CentOS 6.4 升级 Mysq5.5l方法 和 用户远程登录数据库
  13. winform 中show()函数和showdialog()函数区别
  14. java限制一个接口的执行时间_Java 并发编程:任务执行器 Executor 接口
  15. DC漫画公司正在考虑进军NFT市场
  16. WebGIS中利用AGS JS+eCharts实现一些数据展示的探索
  17. Matlab·Simulink的使用—【S函数的创建与应用】
  18. 【数据结构课设】:后缀树
  19. c fflush函数
  20. C# 重载 Equals() 方法、重载运算符、声明显隐式转换的简要整理

热门文章

  1. deferred initcalls与模块化
  2. node.js如何制作命令行工具(一)
  3. 基于百度通用翻译API的一个翻译小工具
  4. matlab slice
  5. cornerstone 使用
  6. struts2框架之拦截器(参考第二天学习笔记)
  7. bzoj千题计划152:bzoj3405: [Usaco2009 Open]Grazing2 移动牛棚
  8. JDK的KeyTool和KeyStore等加密相关
  9. 黑马程序员 oc中的类与对象
  10. UNIGUI中如果获得Session情况