刷新页面防止重复提交

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

/// <summary>
///BasePage 的摘要说明
/// </summary>
public class BasePage : System.Web.UI.Page
{
    private static string PAGE_REFRESH_TICKET_KEY = "__PageRefreshTicketKey";
    private string PAGE_SESSION_REFRESH_TICKET_KEY = "__PageSessionRefreshTicketKey";

    /// <summary>
    /// 判断是否是PostBack
    /// </summary>
    /// <returns></returns>
    protected override System.Collections.Specialized.NameValueCollection DeterminePostBackMode()
    {
        //如果是通过"刷新"提交的后台,将页面强行设置成非PostBack模式,以实现刷新以重新的访问页面的形式进行
        if (IsRefreshed)
        {
            return null;
        }
        return base.DeterminePostBackMode();
    }

    protected override void OnPreRenderComplete(EventArgs e)
    {
        SynchroRefreshTicket();
        base.OnPreRenderComplete(e);
    }

    /// <summary>
    /// 同步页面和后台Session的票据
    /// </summary>
    private void SynchroRefreshTicket()
    {
        if (!Page.IsPostBack)
        {
            string strTicket = Guid.NewGuid().ToString();
            ClientScript.RegisterHiddenField(PAGE_REFRESH_TICKET_KEY, strTicket);
            ClientScript.RegisterHiddenField(PAGE_SESSION_REFRESH_TICKET_KEY, strTicket);
            Session[strTicket] = strTicket;
        }
        else
        {
            string strTicket = Guid.NewGuid().ToString();
            ClientScript.RegisterHiddenField(PAGE_REFRESH_TICKET_KEY, strTicket);
            ClientScript.RegisterHiddenField(PAGE_SESSION_REFRESH_TICKET_KEY, Request.Form[PAGE_SESSION_REFRESH_TICKET_KEY]);
            Session[Request.Form[PAGE_SESSION_REFRESH_TICKET_KEY]] = strTicket;
        }
    }


    /// <summary>
    /// 比较HiddenField的票据和Session中存储的票据是否相同,如果不相同则为通过刷新的方式进行的提交
    /// </summary>
    protected bool IsRefreshed
    {
        get
        {
            if (string.Equals(Request.Form.Get(PAGE_REFRESH_TICKET_KEY), Session[Request.Form.Get(PAGE_SESSION_REFRESH_TICKET_KEY)]))
            {
                return false;
            }
            else
            {
                return true;
            }
        }
    }
}

 

posted @ 2012-11-13 17:44  一千零一夜  阅读(480)  评论(0编辑  收藏  举报