zoukankan      html  css  js  c++  java
  • 屏蔽重复提交表单

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

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

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

    主要是的思想是:

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

    新建Basepage类,继承System.Web.UI.Page
    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;
            }
        }
     
    }
    新建一个.aspx页面--后台
    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>
  • 相关阅读:
    创建struct类型的数组
    simulate windows touch input
    Could not load file using Ranorex runtime : General Questions
    UIAutomator 编译
    w3cmark前端精彩博文周报 10.27-11.2
    w3cmark前端精彩博文周报 10.20-10.27
    w3cmark前端精彩博文周报 10.13-10.19
    sublime自定义snippet代码片段
    Iconfont在移动端遇到问题的探讨
    一个小效果引出的兼容性探讨
  • 原文地址:https://www.cnblogs.com/wupeiqi/p/2977337.html
Copyright © 2011-2022 走看看