国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

ASP.NET中防止頁面刷新造成表單重復提交執行兩次操作

2024-07-10 12:47:21
字體:
來源:轉載
供稿:網友

之前看過別人防刷新的方法,是讓頁面刷新或返回上一步讓頁面過期,這里介紹一種另類的方法,使用Session來處理。

實現原理:

由于刷新提交表單,實際上提交的就是上一次正常提交的表單,所以我們只要做一個標志,判斷出是新表單還是上一次的舊表單就可以分辨出是否進行了重復提交操作。

實現方法:

在頁面上放置一個Hidden域,當頁面第一次載入的時候,在Session里面保存一個標志,同時,把這個標志保存到頁面上的Hidden里面。在提交表單時,判斷表單中提交上來的Hidden和Session中的標志是否一致,就可以知道是正常的提交表單,還是刷新頁面導致的重復提交。需要注意的是,在每次提交表單的處理之后,要更新Session里面的標志。

代碼實例:代碼很少,首先是頁面上。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Test.Web.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 id="Head1" runat="server">  <title></title></head><body>  <form id="form1" runat="server">  <div>    <input type="text" id="tbxName" runat="server" />    <input type="text" id="tbxPass" value="" runat="server" />    <asp:Button ID="btnSubmit" runat="server" OnClick="Button1_Click" Text="Button" />    <asp:Label ID="lblMessage" runat="server" Text=""></asp:Label>    <input id="hiddenTest" type="hidden" value="<%= GetToken() %>" name="hiddenTestN" />  </div>  </form></body></html>

需要注意的地方:

  1 GetToken()函數是為了獲得 Session里面保存的標志。
  2 Hidden使用了非服務器控件,這是因為我使用服務器控件,并在后臺直接獲取Session的標志并賦值給這個Hidden的時候,刷新提交到服務器的 表單中的Hidden的值也發生了改變,猜想是服務器控件的話,表單里面的值是保持同步的,當然,也可能是我用的方法不對,嘎嘎。

下面是后臺代碼:

using System;using System.Data;using System.Configuration;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.Security.Cryptography;using System.Text;namespace Test.Web{  public partial class Default : System.Web.UI.Page  {    protected void Page_Load(object sender, EventArgs e)    {      //第一次載入的時候,生成一個初始的標志      if (null == Session["Token"])      {        SetToken();      }    }    protected void Button1_Click(object sender, EventArgs e)    {      if (Request.Form.Get("hiddenTestN").Equals(GetToken()))      {        lblMessage.ForeColor = System.Drawing.Color.Blue;        lblMessage.Text = "正常提交表單";        SetToken();//別忘了最后要更新Session中的標志      }      else      {        lblMessage.ForeColor = System.Drawing.Color.Red;        lblMessage.Text = "刷新提交表單";      }    }    //獲得當前Session里保存的標志    public string GetToken()    {      if (null != Session["Token"])      {        return Session["Token"].ToString();      }      else      {        return string.Empty;      }    }    //生成標志,并保存到Session    private void SetToken()    {      Session.Add("Token", UserMd5(Session.SessionID + DateTime.Now.Ticks.ToString()));    }    //這個函數純粹是為了讓標志稍微短點兒,一堆亂碼還特有神秘感,另外,這個UserMd5函數是網上找來的現成兒的    protected string UserMd5(string str1)    {      string cl1 = str1;      string pwd = "";      MD5 md5 = MD5.Create();      // 加密后是一個字節類型的數組      byte[] s = md5.ComputeHash(Encoding.Unicode.GetBytes(cl1));      // 通過使用循環,將字節類型的數組轉換為字符串,此字符串 是常規字符格式化所得      for (int i = 0; i < s.Length; i++)      {        // 將得到的字符串使用十六進制類型格式。格式后的字符是 小寫的字母,如果使用大寫(X)則格式后的字符是大寫字符        pwd = pwd + s[i].ToString("X");      }      return pwd;    }  }}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 涞源县| 高邑县| 洞口县| 山东省| 宁津县| 岐山县| 德安县| 湾仔区| 孝昌县| 宣威市| 二连浩特市| 容城县| 绿春县| 眉山市| 金乡县| 隆安县| 塘沽区| 聂拉木县| 郁南县| 徐闻县| 太谷县| 宁化县| 富宁县| 秀山| 乐亭县| 博客| 凤阳县| 大厂| 眉山市| 无棣县| 苏尼特右旗| 拉萨市| 金川县| 临朐县| 和静县| 顺昌县| 安多县| 东兴市| 威远县| 札达县| 平定县|