防止刷新页面提交的方法

检查页面是否通过点击submit按钮而回发的方法是使用IsPostBack,那么有时候我们需要检查一个页面是否被重复刷新过,以便防止重复提交数据。当然,判断方法很多,我这里简单说一下一个比较简单而且容易理解的办法——就是使用Session进行检查(因为Session放在服务端,而且第一次加载访问页面的时候可以进行一个记录,以后就直接判断该页面中的Session是否为null,如果不为null则说明已经刷新过了)。这里我封装了一个控件UserControl,其中代码如下

[C#]

namespace WebCSharp
{
    public partial class RefreshCheck : System.Web.UI.UserControl
    {
        /// <summary>
        /// 是否刷新标识符
        /// </summary>
        public bool ReFreshCheck { get; set; }
        /// <summary>
        /// 获取父页面的类的名称:该名字唯一且不重复,Title可能重复
        /// </summary>
        string parentName = null;

        protected override void OnInit(EventArgs e)
        {
            if (Parent.Parent is Page)
            {
                parentName = Parent.Parent.GetType().Name;

                if (IsPostBack)                  //如果是回发,重新设置第一次加载,不算刷新
                {
                    ReFreshCheck = false;
                    Session[parentName] = null;  //设置null,表示不是重复加载
                }
                else if (Request.UrlReferrer != null && Request.UrlReferrer.ToString() != Request.Url.ToString())
                {
                    Session[parentName] = null;
                }
                else
                {
                    //检测是否是其它页面Response.Redirect过来的,以免误操作
                    if (Session[parentName] == null)
                    {
                        ReFreshCheck = false;
                        Session[parentName] = true;
                    }
                    else
                    {
                        ReFreshCheck = true;
                    }
                }
            }
            else
            {
                throw new Exception("该控件检测本页面是否刷新,故必须放于本页面内!");
            }
        }

    }
}

[VB.NET]

Namespace WebCSharp
    Public Partial Class RefreshCheck
        Inherits System.Web.UI.UserControl
        ''' <summary>
        ''' 是否刷新标识符
        ''' </summary>
        Public Property ReFreshCheck() As Boolean
            Get
                Return m_ReFreshCheck
            End Get
            Set
                m_ReFreshCheck = Value
            End Set
        End Property
        Private m_ReFreshCheck As Boolean
        ''' <summary>
        ''' 获取父页面的类的名称:该名字唯一且不重复,Title可能重复
        ''' </summary>
        Private parentName As String = Nothing

        Protected Overrides Sub OnInit(e As EventArgs)
            If TypeOf Parent.Parent Is Page Then
                parentName = Parent.Parent.[GetType]().Name

                If IsPostBack Then
                    '如果是回发,重新设置第一次加载,不算刷新
                    ReFreshCheck = False
                        '设置null,表示不是重复加载
                    Session(parentName) = Nothing
                ElseIf Request.UrlReferrer IsNot Nothing AndAlso Request.UrlReferrer.ToString() <> Request.Url.ToString() Then
                    Session(parentName) = Nothing
                Else
                    '检测是否是其它页面Response.Redirect过来的,以免误操作
                    If Session(parentName) Is Nothing Then
                        ReFreshCheck = False
                        Session(parentName) = True
                    Else
                        ReFreshCheck = True
                    End If
                End If
            Else
                Throw New Exception("该控件检测本页面是否刷新,故必须放于本页面内!")
            End If
        End Sub
    End Class
End Namespace

你只要拖拽此控件到任意需要检查的页面(必须放在Page中,建议在<div>下)。然后直接使用RefreshCheck检测即可。

posted @ 2012-03-13 11:12  Serviceboy  阅读(1671)  评论(6编辑  收藏  举报