EasyTools---CheckRepost控件(防止重复提交控件)

您是否遇过这样的问题?无缘无故的在数据库出现了两条一样的数据。如果有遇过的话,你觉得是什么原因导致的呢?在这里我告诉你一个这样的场景,相信你也有过这样的经验:用户点击一个提交按钮,此时页面由于网络或服务器繁忙原因,导致响应不过来用户的请求。这时在用户看到的这样一翻情景,点击了没反映,心急点的用户可能会狂点,这样,如果数据库或服务端没有好锁的控制时,就会导致插入两条数据。

那么解决方案该怎么做呢?一般的做法是通过验证码,但验证码要用户输入数据,用户体验不好。但根据这个原理,我们可以做稍微的改造,就能达到目的,下面是我的做法:

首先在页面加载的时候,生成一个随机数,并保存在session里面,同时赋值给一个hidden控件。代码如下:

 1         protected override void OnInit(EventArgs e)
 2         {
 3             
 4             if (Page.IsPostBack)
 5             {
 6                 if (hc.Session[SessionKey] != null)
 7                 {
 8                     isrepost = !hc.Session[SessionKey].Equals(MyConvert.PToInt32(this.ClientID, 0));
 9                 }
10             }
11             Random rd = new Random();
12             hc.Session[SessionKey] = rd.Next(999999);
13         }

上面的代码生成随机数,保存Session,然后在Render事件里面赋值。

1        protected override void Render(HtmlTextWriter output)
2        {
3            this.Value = hc.Session[SessionKey].ToString();
4            base.Render(output);
5        }

这样控件就完成了。
本控件继承了HiddenField控件。
这个控件有两个自定义属性:SessionKey:控件session的键值;IsRepost:布尔型,true为重复提交了,反之正常操作。

控件拖到界面后调用也很方便。
1     protected void Button1_Click(object sender, EventArgs e)
2     {
3         if (CheckRepost1.IsRepost)
4         {
5             Response.Write("<b>您太心急啦,连续点击了两次按钮,造成重复提交!^_^</b><br>");
6         }
7         System.Threading.Thread.Sleep(4000);
8     }

下面附上在线的EasyTools----CheckRepost使用例子  演示    下载例子    下载EasyTools.dll
posted @ 2009-09-02 22:31  hongkid  阅读(2182)  评论(14编辑  收藏  举报