经常遇到ASPX页面重复提交的问题,以前觉得是浏览器和用户的责任,理由是版本高点的浏览器如IE8会提示"是否重复提交?...",如果用户不顾警告重复提交,那是他们的事情。如果浏览器不提示,则是浏览器的责任。
最近有时间,就想解决这个问题。网上一搜一大把,把基本的情况搞清楚了,自己也尝试了几种方法。最终采用了这里介绍的方法 。感谢这位同行。
写了一个简单的控件,方便调用:
1 protected void Page_Load(object sender, EventArgs e)
2 {
3 DuplicatePostTest_ButtonTest.Register(Button1,Button2);
4 }
2 {
3 DuplicatePostTest_ButtonTest.Register(Button1,Button2);
4 }
DuplicatePostTest_ButtonTest是拖到设计器上的自定义控件,Register方法定义成: public void Register(params Button[] buttons),可以一次添加多个需要检测重复提交的Button。
在Button的单击事件方法里:
1 protected void Button2_Click(object sender, EventArgs e)
2 {
3 if (DuplicatePostTest_ButtonTest.IsDuplicatePost)
4 {
5 Response.Write("重复提交。");
6 }
7 else
8 {
9 //做动作
10 Response.Write("正常提交。" + DateTime.Now.ToLongTimeString());
11
12 }
13
14 //重置:
15 DuplicatePostTest_ButtonTest.Reset();
16 }
2 {
3 if (DuplicatePostTest_ButtonTest.IsDuplicatePost)
4 {
5 Response.Write("重复提交。");
6 }
7 else
8 {
9 //做动作
10 Response.Write("正常提交。" + DateTime.Now.ToLongTimeString());
11
12 }
13
14 //重置:
15 DuplicatePostTest_ButtonTest.Reset();
16 }
DuplicatePostTest_ButtonTest.IsDuplicatePost用于测试是否重复提交。最后需要加上DuplicatePostTest_ButtonTest.Reset()重置状态。
下面是实现代码:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
public partial class XX_UserControl_DuplicatePostTest : System.Web.UI.UserControl
{
List<Button> buttonList = new List<Button>(10);
public void Register(params Button[] buttons)
{
string ranID = GetRanID();
foreach (Button bu in buttons)
{
buttonList.Add(bu);
if (bu.PostBackUrl == "")
{
SetPostBackUrl(bu, ranID);
}
}
if (!IsPostBack)
{
Session[SessionKey] = ranID;
}
}
private void SetPostBackUrl(Button button, string ranID)
{
button.PostBackUrl = string.Format("{0}?{1}={2}", this.Page.AppRelativeVirtualPath, ButtonPostBackKey,ranID);
}
public bool IsDuplicatePost
{
get
{
return !Request[ButtonPostBackKey].Equals(Session[SessionKey]);
}
}
public string ButtonPostBackKey
{
get
{
return "DuplicatePostKey";
}
}
string key;
/// <summary>
/// Session和ViewState里存放随机值RanIDkey
/// </summary>
private string SessionKey
{
get
{
if (key == null)
key = string.Format("DuplicatePostTest_{0}", this.Page.AppRelativeTemplateSourceDirectory);
return key;
}
}
/// <summary>
/// 生成随机的字符串
/// </summary>
/// <returns></returns>
private string GetRanID()
{
return DateTime.Now.Ticks.ToString();
}
/// <summary>
/// 重置状态
/// </summary>
public void Reset()
{
string ranID = GetRanID();
foreach (Button bu in buttonList)
{
SetPostBackUrl(bu, ranID);
}
Session[SessionKey] = ranID;
}
}
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
public partial class XX_UserControl_DuplicatePostTest : System.Web.UI.UserControl
{
List<Button> buttonList = new List<Button>(10);
public void Register(params Button[] buttons)
{
string ranID = GetRanID();
foreach (Button bu in buttons)
{
buttonList.Add(bu);
if (bu.PostBackUrl == "")
{
SetPostBackUrl(bu, ranID);
}
}
if (!IsPostBack)
{
Session[SessionKey] = ranID;
}
}
private void SetPostBackUrl(Button button, string ranID)
{
button.PostBackUrl = string.Format("{0}?{1}={2}", this.Page.AppRelativeVirtualPath, ButtonPostBackKey,ranID);
}
public bool IsDuplicatePost
{
get
{
return !Request[ButtonPostBackKey].Equals(Session[SessionKey]);
}
}
public string ButtonPostBackKey
{
get
{
return "DuplicatePostKey";
}
}
string key;
/// <summary>
/// Session和ViewState里存放随机值RanIDkey
/// </summary>
private string SessionKey
{
get
{
if (key == null)
key = string.Format("DuplicatePostTest_{0}", this.Page.AppRelativeTemplateSourceDirectory);
return key;
}
}
/// <summary>
/// 生成随机的字符串
/// </summary>
/// <returns></returns>
private string GetRanID()
{
return DateTime.Now.Ticks.ToString();
}
/// <summary>
/// 重置状态
/// </summary>
public void Reset()
{
string ranID = GetRanID();
foreach (Button bu in buttonList)
{
SetPostBackUrl(bu, ranID);
}
Session[SessionKey] = ranID;
}
}