Skip Navigation Links
技术文档
·网站建设
·软件使用
·图形设计
·程序开发
·网络应用
·电脑技巧
 
公司介绍
·公司简介
·索仕SRCOS网络应用平台
·索仕网站管理系统
·影视广告制作
·联系我们
 
 

Loading控件--防止用户反复提交

7/25/2008 3:24:31 PM

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" />LoadingLoading控件--防止用户反复提交
18                 </ProgressTemplate>
19             </King:LoadingControl>
20         </div>
21     </form>
22 </body>
23 </html>
24 
       为了能看到Loading的效果我们在Page_Load使用System.Threading.Thread.Sleep(3000);做延迟。
页面render出来的代码如下:
 
Loading控件--防止用户反复提交<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Loading控件--防止用户反复提交
<html xmlns="http://www.w3.org/1999/xhtml">
Loading控件--防止用户反复提交
<head><title>
Loading控件--防止用户反复提交    Untitled Page
Loading控件--防止用户反复提交
</title></head>
Loading控件--防止用户反复提交
<body>
Loading控件--防止用户反复提交    
<form name="form1" method="post" action="default.aspx" id="form1">
Loading控件--防止用户反复提交
<div>
Loading控件--防止用户反复提交
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTEzMTA5NTM4NzBkZLrTZqXsuouOmVoeCXorqE2igxmz" />
Loading控件--防止用户反复提交
</div>
Loading控件--防止用户反复提交
Loading控件--防止用户反复提交        
<div>
Loading控件--防止用户反复提交            
<span><span onclick="javascript:this.style.display='none';document.getElementById('progress').style.display='';" id="content">
Loading控件--防止用户反复提交                    
<input type="submit" name="ctl02$Button1" value="Button" id="ctl02_Button1" />
Loading控件--防止用户反复提交                
</span><span id="progress" style="display:none">
Loading控件--防止用户反复提交                    
<img src="loader.gif" />LoadingLoading控件--防止用户反复提交
Loading控件--防止用户反复提交                
</span></span>
Loading控件--防止用户反复提交        
</div>
Loading控件--防止用户反复提交    
Loading控件--防止用户反复提交
<div>
Loading控件--防止用户反复提交
Loading控件--防止用户反复提交    
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAgLd8PGLAgLbhbjtDTVN73GhBUNr1cM8hkjWUdhLBytV" />
Loading控件--防止用户反复提交
</div></form>
Loading控件--防止用户反复提交
</body>
Loading控件--防止用户反复提交
</html>
Loading控件--防止用户反复提交
控件实现
    其实就两个要点:
  1.  控件要支持两个模板一个是ContentTemplate这个是要隐藏部分的模板,一个是Progress模板用来放Loading的提示信息
  2. 添加javascript脚本来实现隐藏,这个利用事件传递的原理可以方便的实现
这个控件超简单直接贴代码了,控件源代码如下:
 
  1Loading控件--防止用户反复提交using System;
  2Loading控件--防止用户反复提交using System.ComponentModel;
  3Loading控件--防止用户反复提交using System.Drawing;
  4Loading控件--防止用户反复提交using System.Security.Permissions;
  5Loading控件--防止用户反复提交using System.Web;
  6Loading控件--防止用户反复提交using System.Web.UI;
  7Loading控件--防止用户反复提交using System.Web.UI.WebControls;
  8Loading控件--防止用户反复提交
  9Loading控件--防止用户反复提交namespace KingWebControlToolkit
 10{
 11Loading控件--防止用户反复提交    [
 12Loading控件--防止用户反复提交    AspNetHostingPermission(SecurityAction.InheritanceDemand,
 13Loading控件--防止用户反复提交        Level = AspNetHostingPermissionLevel.Minimal),
 14Loading控件--防止用户反复提交    AspNetHostingPermission(SecurityAction.Demand,
 15Loading控件--防止用户反复提交        Level = AspNetHostingPermissionLevel.Minimal),
 16Loading控件--防止用户反复提交    ToolboxData(
 17Loading控件--防止用户反复提交        "<{0}:LoadingControl runat=\"server\"> </{0}:LoadingControl>"),
 18Loading控件--防止用户反复提交    ]
 19Loading控件--防止用户反复提交    public class LoadingControl : CompositeControl
 20    {
 21Loading控件--防止用户反复提交        private ITemplate contentTempalte;
 22Loading控件--防止用户反复提交        private ITemplate progressTemplate;
 23Loading控件--防止用户反复提交
 24Loading控件--防止用户反复提交        private TemplateContainer contentContainer;
 25Loading控件--防止用户反复提交        private TemplateContainer progressContainer;
 26Loading控件--防止用户反复提交        [
 27Loading控件--防止用户反复提交        Browsable(false),
 28Loading控件--防止用户反复提交        DesignerSerializationVisibility(
 29Loading控件--防止用户反复提交            DesignerSerializationVisibility.Hidden)
 30Loading控件--防止用户反复提交        ]
 31Loading控件--防止用户反复提交        public TemplateContainer Owner
 32        {
 33Loading控件--防止用户反复提交            get
 34            {
 35Loading控件--防止用户反复提交                return contentContainer;
 36Loading控件--防止用户反复提交            }

 37Loading控件--防止用户反复提交        }

 38Loading控件--防止用户反复提交
 39Loading控件--防止用户反复提交        [
 40Loading控件--防止用户反复提交        Browsable(false),
 41Loading控件--防止用户反复提交        PersistenceMode(PersistenceMode.InnerProperty),
 42Loading控件--防止用户反复提交        DefaultValue(typeof(ITemplate), ""),
 43Loading控件--防止用户反复提交        Description("Control template"),
 44Loading控件--防止用户反复提交        TemplateContainer(typeof(LoadingControl ))
 45Loading控件--防止用户反复提交        ]
 46Loading控件--防止用户反复提交        public virtual ITemplate ContentTemplate
 47        {
 48Loading控件--防止用户反复提交            get
 49            {
 50Loading控件--防止用户反复提交                return contentTempalte;
 51Loading控件--防止用户反复提交            }

 52Loading控件--防止用户反复提交            set
 53            {
 54Loading控件--防止用户反复提交                contentTempalte = value;
 55Loading控件--防止用户反复提交            }

 56Loading控件--防止用户反复提交        }

 57Loading控件--防止用户反复提交
 58Loading控件--防止用户反复提交        [
 59Loading控件--防止用户反复提交        Browsable(false),
 60Loading控件--防止用户反复提交        PersistenceMode(PersistenceMode.InnerProperty),
 61Loading控件--防止用户反复提交        DefaultValue(typeof(ITemplate), ""),
 62Loading控件--防止用户反复提交        Description("Control template"),
 63Loading控件--防止用户反复提交        TemplateContainer(typeof(LoadingControl))
 64Loading控件--防止用户反复提交        ]
 65Loading控件--防止用户反复提交        public virtual ITemplate ProgressTemplate
 66        {
 67Loading控件--防止用户反复提交            get
 68            {
 69Loading控件--防止用户反复提交                return progressTemplate;
 70Loading控件--防止用户反复提交            }

 71Loading控件--防止用户反复提交            set
 72            {
 73Loading控件--防止用户反复提交                progressTemplate = value;
 74Loading控件--防止用户反复提交            }

 75Loading控件--防止用户反复提交        }

 76Loading控件--防止用户反复提交
 77Loading控件--防止用户反复提交        protected override void CreateChildControls()
 78        {
 79Loading控件--防止用户反复提交            Controls.Clear();
 80Loading控件--防止用户反复提交            contentContainer = new TemplateContainer();
 81Loading控件--防止用户反复提交            progressContainer = new TemplateContainer();
 82Loading控件--防止用户反复提交            contentContainer.Attributes["onclick"= "javascript:this.style.display='none';document.getElementById('progress').style.display='';";
 83Loading控件--防止用户反复提交            contentContainer.Attributes["id"= "content";
 84Loading控件--防止用户反复提交            progressContainer.Attributes["id"= "progress";
 85Loading控件--防止用户反复提交            progressContainer.Attributes["style"= "display:none";
 86Loading控件--防止用户反复提交            ITemplate temp = contentTempalte;
 87Loading控件--防止用户反复提交            if (temp == null)
 88            {
 89Loading控件--防止用户反复提交                temp = new DefaultTemplate();
 90Loading控件--防止用户反复提交            }

 91Loading控件--防止用户反复提交            temp.InstantiateIn(contentContainer);
 92Loading控件--防止用户反复提交            
 93Loading控件--防止用户反复提交            temp = progressTemplate;
 94Loading控件--防止用户反复提交            temp.InstantiateIn(progressContainer);
 95Loading控件--防止用户反复提交            this.Controls.Add(contentContainer);
 96Loading控件--防止用户反复提交            this.Controls.Add(progressContainer);
 97Loading控件--防止用户反复提交        }

 98Loading控件--防止用户反复提交    }

 99Loading控件--防止用户反复提交
100Loading控件--防止用户反复提交    [
101Loading控件--防止用户反复提交    ToolboxItem(false)
102Loading控件--防止用户反复提交    ]
103Loading控件--防止用户反复提交    public class TemplateContainer : WebControl
104    {
105Loading控件--防止用户反复提交    }

106Loading控件--防止用户反复提交
107    DefaultTemplate DefaultTemplate
108Loading控件--防止用户反复提交    sealed class DefaultTemplate : ITemplate
109    {
110Loading控件--防止用户反复提交        void ITemplate.InstantiateIn(Control owner)
111        {
112Loading控件--防止用户反复提交            LiteralControl linebreak = new LiteralControl("<br/><font size='2' color='blue' >没有制定模板内容,显示默认模板<br/>Tip:Tempalte id not defined,using default Tempalte.</font>");
113Loading控件--防止用户反复提交            owner.Controls.Add(linebreak);
114Loading控件--防止用户反复提交        }

115Loading控件--防止用户反复提交    }

116Loading控件--防止用户反复提交    #endregion

117Loading控件--防止用户反复提交}
118Loading控件--防止用户反复提交
Demo下载:loadingdemo.rar
 
本文附件:
loadingdemo.rar
作者:坚强2002 来源:博客园
 
 
 
昆明索仕科技开发有限公司 版权所有 Copyright© 2002-2010 Kunming Source Technology Exploitive Co.,LTD. All Rights Reserved.
电话:0871-5627877 业务QQ:163871 联系我们
本站基于:索仕网站信息管理系统建设 版本 2.0.4325