您是否遇过这样的问题?无缘无故的在数据库出现了两条一样的数据。如果有遇过的话,你觉得是什么原因导致的呢?在这里我告诉你一个这样的场景,相信你也有过这样的经验:用户点击一个提交按钮,此时页面由于网络或服务器繁忙原因,导致响应不过来用户的请求。这时在用户看到的这样一翻情景,点击了没反映,心急点的用户可能会狂点,这样,如果数据库或服务端没有好锁的控制时,就会导致插入两条数据。
那么解决方案该怎么做呢?一般的做法是通过验证码,但验证码要用户输入数据,用户体验不好。但根据这个原理,我们可以做稍微的改造,就能达到目的,下面是我的做法:
首先在页面加载的时候,生成一个随机数,并保存在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
Tag标签: 控件,EasyTools