天天看点

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

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

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

<a></a>

 1 &lt;%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %&gt;

 2 

 3 &lt;%@ Register Assembly="KingWebControlToolkit" Namespace="KingWebControlToolkit" TagPrefix="King" %&gt;

 4 &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;

 5 &lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;

 6 &lt;head runat="server"&gt;

 7     &lt;title&gt;Untitled Page&lt;/title&gt;

 8 &lt;/head&gt;

 9 &lt;body&gt;

10     &lt;form id="form1" runat="server"&gt;

11         &lt;div&gt;

12             &lt;King:LoadingControl runat="server"&gt;

13                 &lt;ContentTemplate&gt;

14                     &lt;asp:Button ID="Button1" runat="server" Text="Button" /&gt;

15                 &lt;/ContentTemplate&gt;

16                 &lt;ProgressTemplate&gt;

17                     &lt;img src="loader.gif" /&gt;Loading

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

18                 &lt;/ProgressTemplate&gt;

19             &lt;/King:LoadingControl&gt;

20         &lt;/div&gt;

21     &lt;/form&gt;

22 &lt;/body&gt;

23 &lt;/html&gt;

24 

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

页面render出来的代码如下:

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

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;

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

&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;

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

&lt;head&gt;&lt;title&gt;

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

    Untitled Page

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

&lt;/title&gt;&lt;/head&gt;

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

&lt;body&gt;

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

    &lt;form name="form1" method="post" action="default.aspx" id="form1"&gt;

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

&lt;div&gt;

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

&lt;input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTEzMTA5NTM4NzBkZLrTZqXsuouOmVoeCXorqE2igxmz" /&gt;

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

&lt;/div&gt;

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

        &lt;div&gt;

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

            &lt;span&gt;&lt;span onclick="javascript:this.style.display='none';document.getElementById('progress').style.display='';" id="content"&gt;

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

                    &lt;input type="submit" name="ctl02$Button1" value="Button" id="ctl02_Button1" /&gt;

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

                &lt;/span&gt;&lt;span id="progress" style="display:none"&gt;

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

                    &lt;img src="loader.gif" /&gt;Loading

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

                &lt;/span&gt;&lt;/span&gt;

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

        &lt;/div&gt;

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

    &lt;input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAgLd8PGLAgLbhbjtDTVN73GhBUNr1cM8hkjWUdhLBytV" /&gt;

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

&lt;/div&gt;&lt;/form&gt;

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

&lt;/body&gt;

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

&lt;/html&gt;

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

控件实现

    其实就两个要点:

  控件要支持两个模板一个是ContentTemplate这个是要隐藏部分的模板,一个是Progress模板用来放Loading的提示信息

添加javascript脚本来实现隐藏,这个利用事件传递的原理可以方便的实现

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

  1

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

using System;

  2

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

using System.ComponentModel;

  3

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

using System.Drawing;

  4

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

using System.Security.Permissions;

  5

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

using System.Web;

  6

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

using System.Web.UI;

  7

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

using System.Web.UI.WebControls;

  8

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

  9

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

namespace KingWebControlToolkit

 10

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

{

 11

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

    [

 12

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

    AspNetHostingPermission(SecurityAction.InheritanceDemand,

 13

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

        Level = AspNetHostingPermissionLevel.Minimal),

 14

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

    AspNetHostingPermission(SecurityAction.Demand,

 15

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

 16

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

    ToolboxData(

 17

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

        "&lt;{0}:LoadingControl runat=\"server\"&gt; &lt;/{0}:LoadingControl&gt;"),

 18

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

    ]

 19

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

    public class LoadingControl : CompositeControl

 20

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

    {

 21

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

        private ITemplate contentTempalte;

 22

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

        private ITemplate progressTemplate;

 23

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

 24

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

        private TemplateContainer contentContainer;

 25

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

        private TemplateContainer progressContainer;

 26

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

        [

 27

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

        Browsable(false),

 28

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

        DesignerSerializationVisibility(

 29

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

            DesignerSerializationVisibility.Hidden)

 30

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

        ]

 31

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

        public TemplateContainer Owner

 32

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

        {

 33

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

            get

 34

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

            {

 35

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

                return contentContainer;

 36

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

            }

 37

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

        }

 38

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

 39

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

 40

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

 41

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

        PersistenceMode(PersistenceMode.InnerProperty),

 42

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

        DefaultValue(typeof(ITemplate), ""),

 43

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

        Description("Control template"),

 44

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

        TemplateContainer(typeof(LoadingControl ))

 45

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

 46

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

        public virtual ITemplate ContentTemplate

 47

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

 48

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

 49

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

 50

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

                return contentTempalte;

 51

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

 52

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

            set

 53

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

 54

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

                contentTempalte = value;

 55

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

 56

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

 57

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

 58

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

 59

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

 60

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

 61

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

 62

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

 63

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

        TemplateContainer(typeof(LoadingControl))

 64

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

 65

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

        public virtual ITemplate ProgressTemplate

 66

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

 67

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

 68

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

 69

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

                return progressTemplate;

 70

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

 71

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

 72

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

 73

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

                progressTemplate = value;

 74

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

 75

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

 76

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

 77

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

        protected override void CreateChildControls()

 78

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

 79

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

            Controls.Clear();

 80

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

            contentContainer = new TemplateContainer();

 81

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

            progressContainer = new TemplateContainer();

 82

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

            contentContainer.Attributes["onclick"] = "javascript:this.style.display='none';document.getElementById('progress').style.display='';";

 83

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

            contentContainer.Attributes["id"] = "content";

 84

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

            progressContainer.Attributes["id"] = "progress";

 85

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

            progressContainer.Attributes["style"] = "display:none";

 86

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

            ITemplate temp = contentTempalte;

 87

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

            if (temp == null)

 88

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

 89

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

                temp = new DefaultTemplate();

 90

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

 91

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

            temp.InstantiateIn(contentContainer);

 92

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

 93

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

            temp = progressTemplate;

 94

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

            temp.InstantiateIn(progressContainer);

 95

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

            this.Controls.Add(contentContainer);

 96

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

            this.Controls.Add(progressContainer);

 97

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

 98

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

    }

 99

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

100

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

101

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

    ToolboxItem(false)

102

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

103

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

    public class TemplateContainer : WebControl

104

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

105

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

106

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

107

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

    DefaultTemplate

117

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

}

118

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

继续阅读