屏蔽重复提交表单

简介:

读了城南的博客中的《屏蔽刷新提交后台》一文之后,对于解决屏蔽重复提交表单有了更好的认识。

对于重复提交表单个人觉得有以下解决方案:
1、利用Ajax提交,这样的自然而然的不会再涉及到重复提交表单。
2、利用前后台标记,判断是否是重复提交-----------也就是城南博客中的方法。

个人学习了城南博客中的方法,加以自己的理解,做了下修改。

主要是的思想是:

  自己写一个类,去继承System.Web.UI.Page类,在此类中对Page类扩展。即:在页面下Render到页面时,发送一个到页面的Hide控件并增加一个Session。当再次访问时判断发回的控件的值和Session值是否一致,从而确定当前操作是否是有刷新导致的提交。

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
///Basepage 的摘要说明
/// </summary>
public class Basepage:System.Web.UI.Page
{
    private static string PAGE_REFRESH_TICKET_KEY = "__111111111111Key";
    private string PAGE_SESSION_REFRESH_TICKET_KEY = "__2222222222Key";
    protected override void OnPreRenderComplete(EventArgs e)
    {
        SynchroRefreshTicket();
        base.OnPreRenderComplete(e);
    }

    /// <summary>
    /// 同步页面和后台Session的票据
    /// </summary>
    private void SynchroRefreshTicket()
    {

        string strTicket = Guid.NewGuid().ToString();
        ClientScript.RegisterHiddenField(PAGE_REFRESH_TICKET_KEY, strTicket);

        Session[PAGE_SESSION_REFRESH_TICKET_KEY] = strTicket;

    }

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

public partial class _Default :Basepage //继承自己写的类
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        if (this.IsRefreshed)
        {
            //如果是重复提交的话,就重新加载本页面
            //Response.Redirect(Request.Url.ToString());
            Response.Write("刷新");
        }
        else
        {
            Response.Write("提交");
        }
    }
}
复制代码
复制代码
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
       <asp:Label ID="Label1" runat="server"></asp:Label>
        <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
    </div>
    </form>
</body>
</html>
复制代码

 



本文转自武沛齐博客园博客,原文链接:http://www.cnblogs.com/wupeiqi/archive/2013/03/23/2977337.html,如需转载请自行联系原作者

目录
相关文章
|
3月前
|
JavaScript 前端开发 数据安全/隐私保护
提交表单与验证表单案例
提交表单与验证表单案例
18 0
|
设计模式 JavaScript 数据库
表单防止重复提交的四种方式
表单防止重复提交的四种方式
187 0
|
JavaScript 前端开发
自动提交表单的实现方法
可以解决采集需要自动提交的问题!   方法一:   Untitled Document (1)自动提交表单:    setTimeout("document.form1.submit()",10000)                      10秒后提交。
2335 0
|
存储 SQL 算法
最简单的6种防止数据重复提交的方法!(干货)下
最简单的6种防止数据重复提交的方法!(干货)
305 1
|
存储 前端开发 安全
最简单的6种防止数据重复提交的方法!(干货)上
最简单的6种防止数据重复提交的方法!(干货)
783 0
最简单的6种防止数据重复提交的方法!(干货)上
|
JavaScript
jQuery 禁用表单提交按钮,防止用户请求重复提交
jQuery 禁用表单提交按钮,防止用户请求重复提交
166 0
jQuery 禁用表单提交按钮,防止用户请求重复提交
|
NoSQL Redis 数据库
重复提交,你是如何处理的?
幂等性就是说无论你执行几次请求,其结果是一样的。说到了幂等就不得不说重复提交了,你连续点击提交按钮,理论上来说这是同一条数据,数据库应该只能存入一条,而实际上存放了多条,这就违反了幂等性。因此我们就需要做一些处理,来保证连续点击提交按钮后,数据库只能存入一条数据。
640 0