Loading控件--防止用户反复提交 [源码+Demo]

简介:
 

 Web系统中经常会遇到这样的情况:页面提交很慢,用户耐心受到挑战就开始摧残页面上的按钮,反复点击反而搞得更慢。前两天就遇到这样一个问题,用户要进行大数据量的导出操作,这个服务器端需要比较长的时间处理,于是很容易出现用户等得不耐烦就反复点击导出按钮的情况。

       比较简单的解决方法就是在用户进行了点击操作将按钮之类的东西隐藏掉,国外的一位同行写了一个对button的扩展:pleasewaitButton 源文档 <http://www.codeproject.com/KB/webforms/PleaseWaitButton.aspx就是实现了这个效果。但是这个控件是有局限的,有时候要隐藏的不只是按钮。我觉得可以学习UpdatePanel的“包起来”一个区域的方式以获得更大的灵活性。

       下面是页面代码的一个示例:

复制代码
 1  <% @ Page Language = " C# "  AutoEventWireup = " true "  CodeFile = " Default.aspx.cs "  Inherits = " _Default "   %>
 2 
 3  <% @ Register Assembly = " KingWebControlToolkit "  Namespace = " KingWebControlToolkit "  TagPrefix = " King "   %>
 4  <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
 5  < html  xmlns ="http://www.w3.org/1999/xhtml" >
 6  < head  runat ="server" >
 7       < title > Untitled Page </ title >
 8  </ head >
 9  < body >
10       < form  id ="form1"  runat ="server" >
11           < div >
12               < King:LoadingControl  runat ="server" >
13                   < ContentTemplate >
14                       < asp:Button  ID ="Button1"  runat ="server"  Text ="Button"   />
15                   </ ContentTemplate >
16                   < ProgressTemplate >
17                       < img  src ="loader.gif"   /> Loadingdot.gif
18                   </ ProgressTemplate >
19               </ King:LoadingControl >
20           </ div >
21       </ form >
22  </ body >
23  </ html >
24 
复制代码

       为了能看到Loading的效果我们在Page_Load使用System.Threading.Thread.Sleep(3000);做延迟。

页面render出来的代码如下:

复制代码
None.gif <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
None.gif
< html  xmlns ="http://www.w3.org/1999/xhtml" >
None.gif
< head >< title >
None.gif    Untitled Page
None.gif
</ title ></ head >
None.gif
< body >
None.gif    
< form  name ="form1"  method ="post"  action ="default.aspx"  id ="form1" >
None.gif
< div >
None.gif
< input  type ="hidden"  name ="__VIEWSTATE"  id ="__VIEWSTATE"  value ="/wEPDwULLTEzMTA5NTM4NzBkZLrTZqXsuouOmVoeCXorqE2igxmz"   />
None.gif
</ div >
None.gif
None.gif        
< div >
None.gif            
< span >< span  onclick ="javascript:this.style.display='none';document.getElementById('progress').style.display='';"  id ="content" >
None.gif                    
< input  type ="submit"  name ="ctl02$Button1"  value ="Button"  id ="ctl02_Button1"   />
None.gif                
</ span >< span  id ="progress"  style ="display:none" >
None.gif                    
< img  src ="loader.gif"   /> Loadingdot.gif
None.gif                
</ span ></ span >
None.gif        
</ div >
None.gif    
None.gif
< div >
None.gif
None.gif    
< input  type ="hidden"  name ="__EVENTVALIDATION"  id ="__EVENTVALIDATION"  value ="/wEWAgLd8PGLAgLbhbjtDTVN73GhBUNr1cM8hkjWUdhLBytV"   />
None.gif
</ div ></ form >
None.gif
</ body >
None.gif
</ html >
None.gif
复制代码

控件实现

    其实就两个要点:

  1.   控件要支持两个模板一个是ContentTemplate这个是要隐藏部分的模板,一个是Progress模板用来放Loading的提示信息
  2. 添加javascript脚本来实现隐藏,这个利用事件传递的原理可以方便的实现

这个控件超简单直接贴代码了,控件源代码如下:

复制代码
  1 None.gif using  System;
  2 None.gif using  System.ComponentModel;
  3 None.gif using  System.Drawing;
  4 None.gif using  System.Security.Permissions;
  5 None.gif using  System.Web;
  6 None.gif using  System.Web.UI;
  7 None.gif using  System.Web.UI.WebControls;
  8 None.gif
  9 None.gif namespace  KingWebControlToolkit
 10 ExpandedBlockStart.gif {
 11InBlock.gif    [
 12InBlock.gif    AspNetHostingPermission(SecurityAction.InheritanceDemand,
 13InBlock.gif        Level = AspNetHostingPermissionLevel.Minimal),
 14InBlock.gif    AspNetHostingPermission(SecurityAction.Demand,
 15InBlock.gif        Level = AspNetHostingPermissionLevel.Minimal),
 16InBlock.gif    ToolboxData(
 17InBlock.gif        "<{0}:LoadingControl runat=\"server\"> </{0}:LoadingControl>"),
 18InBlock.gif    ]
 19InBlock.gif    public class LoadingControl : CompositeControl
 20ExpandedSubBlockStart.gif    {
 21InBlock.gif        private ITemplate contentTempalte;
 22InBlock.gif        private ITemplate progressTemplate;
 23InBlock.gif
 24InBlock.gif        private TemplateContainer contentContainer;
 25InBlock.gif        private TemplateContainer progressContainer;
 26InBlock.gif        [
 27InBlock.gif        Browsable(false),
 28InBlock.gif        DesignerSerializationVisibility(
 29InBlock.gif            DesignerSerializationVisibility.Hidden)
 30InBlock.gif        ]
 31InBlock.gif        public TemplateContainer Owner
 32ExpandedSubBlockStart.gif        {
 33InBlock.gif            get
 34ExpandedSubBlockStart.gif            {
 35InBlock.gif                return contentContainer;
 36ExpandedSubBlockEnd.gif            }

 37ExpandedSubBlockEnd.gif        }

 38InBlock.gif
 39InBlock.gif        [
 40InBlock.gif        Browsable(false),
 41InBlock.gif        PersistenceMode(PersistenceMode.InnerProperty),
 42InBlock.gif        DefaultValue(typeof(ITemplate), ""),
 43InBlock.gif        Description("Control template"),
 44InBlock.gif        TemplateContainer(typeof(LoadingControl ))
 45InBlock.gif        ]
 46InBlock.gif        public virtual ITemplate ContentTemplate
 47ExpandedSubBlockStart.gif        {
 48InBlock.gif            get
 49ExpandedSubBlockStart.gif            {
 50InBlock.gif                return contentTempalte;
 51ExpandedSubBlockEnd.gif            }

 52InBlock.gif            set
 53ExpandedSubBlockStart.gif            {
 54InBlock.gif                contentTempalte = value;
 55ExpandedSubBlockEnd.gif            }

 56ExpandedSubBlockEnd.gif        }

 57InBlock.gif
 58InBlock.gif        [
 59InBlock.gif        Browsable(false),
 60InBlock.gif        PersistenceMode(PersistenceMode.InnerProperty),
 61InBlock.gif        DefaultValue(typeof(ITemplate), ""),
 62InBlock.gif        Description("Control template"),
 63InBlock.gif        TemplateContainer(typeof(LoadingControl))
 64InBlock.gif        ]
 65InBlock.gif        public virtual ITemplate ProgressTemplate
 66ExpandedSubBlockStart.gif        {
 67InBlock.gif            get
 68ExpandedSubBlockStart.gif            {
 69InBlock.gif                return progressTemplate;
 70ExpandedSubBlockEnd.gif            }

 71InBlock.gif            set
 72ExpandedSubBlockStart.gif            {
 73InBlock.gif                progressTemplate = value;
 74ExpandedSubBlockEnd.gif            }

 75ExpandedSubBlockEnd.gif        }

 76InBlock.gif
 77InBlock.gif        protected override void CreateChildControls()
 78ExpandedSubBlockStart.gif        {
 79InBlock.gif            Controls.Clear();
 80InBlock.gif            contentContainer = new TemplateContainer();
 81InBlock.gif            progressContainer = new TemplateContainer();
 82InBlock.gif            contentContainer.Attributes["onclick"= "javascript:this.style.display='none';document.getElementById('progress').style.display='';";
 83InBlock.gif            contentContainer.Attributes["id"= "content";
 84InBlock.gif            progressContainer.Attributes["id"= "progress";
 85InBlock.gif            progressContainer.Attributes["style"= "display:none";
 86InBlock.gif            ITemplate temp = contentTempalte;
 87InBlock.gif            if (temp == null)
 88ExpandedSubBlockStart.gif            {
 89InBlock.gif                temp = new DefaultTemplate();
 90ExpandedSubBlockEnd.gif            }

 91InBlock.gif            temp.InstantiateIn(contentContainer);
 92InBlock.gif            
 93InBlock.gif            temp = progressTemplate;
 94InBlock.gif            temp.InstantiateIn(progressContainer);
 95InBlock.gif            this.Controls.Add(contentContainer);
 96InBlock.gif            this.Controls.Add(progressContainer);
 97ExpandedSubBlockEnd.gif        }

 98ExpandedSubBlockEnd.gif    }

 99InBlock.gif
100InBlock.gif    [
101InBlock.gif    ToolboxItem(false)
102InBlock.gif    ]
103InBlock.gif    public class TemplateContainer : WebControl
104ExpandedSubBlockStart.gif    {
105ExpandedSubBlockEnd.gif    }

106InBlock.gif
107ContractedSubBlock.gif    DefaultTemplate
117ExpandedBlockEnd.gif}

118 None.gif
Demo下载:http://files.cnblogs.com/me-sa/loadingdemo.rar
复制代码
目录
相关文章
|
10月前
|
前端开发 JavaScript
使用Element-UI中的el-upload实现文件的上传demo(亲测有用)
使用Element-UI中的el-upload实现文件的上传demo(亲测有用)
|
24天前
踩坑——使用了dispatchTouchEvent后控件点击无效问题
踩坑——使用了dispatchTouchEvent后控件点击无效问题
11 0
|
4月前
|
前端开发 JavaScript
Layui上传文件时choose事件只触发一次的问题(两种解决方案+最终解决方案源码)
Layui上传文件时choose事件只触发一次的问题(两种解决方案+最终解决方案源码)
101 0
uniapp使用button移除边框效果demo(整理)
uniapp使用button移除边框效果demo(整理)
|
7月前
|
JavaScript
js左划出现删除按钮,右滑隐藏demo效果示例(整理)
js左划出现删除按钮,右滑隐藏demo效果示例(整理)
js左划出现删除按钮,右滑隐藏demo效果示例(整理)
|
数据库 Android开发
AndroidQ(10.0) 自带音乐APP正在扫描中bug修改
AndroidQ(10.0) 自带音乐APP正在扫描中bug修改
75 0
jira学习案例61-userState的懒初始化和保存函数状态1
jira学习案例61-userState的懒初始化和保存函数状态1
56 0
jira学习案例61-userState的懒初始化和保存函数状态1
jira学习案例63-userState的懒初始化和保存函数状态3
jira学习案例63-userState的懒初始化和保存函数状态3
64 0
jira学习案例63-userState的懒初始化和保存函数状态3
jira学习案例62-userState的懒初始化和保存函数状态2
jira学习案例62-userState的懒初始化和保存函数状态2
40 0
jira学习案例62-userState的懒初始化和保存函数状态2
|
前端开发 Linux 程序员
「HTML+CSS」--自定义加载动画【014】【疑问未解决】
「HTML+CSS」--自定义加载动画【014】【疑问未解决】
115 0
「HTML+CSS」--自定义加载动画【014】【疑问未解决】