经常遇到ASPX页面重复提交的问题,以前觉得是浏览器和用户的责任,理由是版本高点的浏览器如IE8会提示"是否重复提交?...",如果用户不顾警告重复提交,那是他们的事情。如果浏览器不提示,则是浏览器的责任。
最近有时间,就想解决这个问题。网上一搜一大把,把基本的情况搞清楚了,自己也尝试了几种方法。最终采用了这里介绍的方法 。感谢这位同行。
写了一个简单的控件,方便调用:

1  protected void Page_Load(object sender, EventArgs e)
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     }

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;
    }
}

 

posted on 2009-04-02 11:08  apple123  阅读(725)  评论(0编辑  收藏  举报