亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Asp.Net防止刷新重復(fù)提交數(shù)據(jù)的辦法

 更新時(shí)間:2013年03月06日 10:36:00   作者:  
最近在用Asp.Net編寫(xiě)點(diǎn)東西時(shí)遇到個(gè)問(wèn)題:即用戶在提交表單后按刷新就會(huì)重復(fù)提交數(shù)據(jù),即所謂的“刷新重復(fù)提交”的問(wèn)題。

在網(wǎng)上搜 一下,可以找到很多關(guān)于這方面的資料,其中有一篇是來(lái)自MSDN上的一種解決方法: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/BedrockASPNET.asp 它是通過(guò)重新定義 System.Web.UI.Page 類來(lái)實(shí)現(xiàn)加載頁(yè)面時(shí),是“刷新”、“后退”請(qǐng)求,還是正常請(qǐng)求,其他的頁(yè)面則繼承了自定義的這 個(gè)Page類。感覺(jué)他這個(gè)方法比較獨(dú)特,有例子可以下載,有興趣的可以研究研究。

網(wǎng)上最多的解決此類問(wèn)題的方法就是不保存緩存,即提交后表單上的數(shù)據(jù)不會(huì)被瀏覽器的緩存保存,如果此時(shí)再遇到刷新或者后退請(qǐng)求時(shí), 就會(huì)顯示“網(wǎng)頁(yè)已過(guò)期”,數(shù)據(jù)也就不會(huì)重復(fù)提交了,這就起到了阻止刷新重復(fù)提交的效果。

下面以簡(jiǎn)單的提交一篇帖子為例,介紹禁用緩存防止刷新重復(fù)提交的方法,表單數(shù)據(jù)包括“標(biāo)題”和“正文”兩個(gè)部分。

以下是該方法的代碼(post.aspx):

復(fù)制代碼 代碼如下:

//頁(yè)面加載

protected void Page_Load(object sender, EventArgs e)

{

   //可以在頁(yè)面加載時(shí)設(shè)置頁(yè)面的緩存為“SetNoStore()”,即無(wú)緩存

   Response.Cache.SetNoStore();

   //Session中存儲(chǔ)的變量“IsSubmit”是標(biāo)記是否提交成功的

   if ((bool)Session["IsSubmit"])

   {

     //如果表單數(shù)據(jù)提交成功,就設(shè)“Session["IsSubmit"]”為false

     Session["IsSubmit"] = false;

     //顯示提交成功信息

     ShowMsg.Text = " * 提交成功!";

   }

   else

     //否則的話(沒(méi)有提交,或者是頁(yè)面刷新),不顯示任何信息

     ShowMsg.Text = "";

}

//提交按鈕(btnOK)單擊事件

protected void btnOK_Click(object sender, EventArgs e)

{

   if (txtTitle.Text.ToString().Trim() == "")

     //ShowMsg是用來(lái)顯示提示信息的

     ShowMsg.Text = " * 標(biāo)題不能為空!";

  else if (txtText.Text.ToString().Trim() == "")

     ShowMsg.Text = " * 內(nèi)容不能為空!";

  else

   {

     //這里是將數(shù)據(jù)提交到數(shù)據(jù)庫(kù)中,省略

     /*

     string sql = "insert into tab...values(...)";

     MyConn.ExecQuery(sql);

     */

     //提交成功后,設(shè)“Session["IsSubmit"]”為true

     Session["IsSubmit"] = true;

     //強(qiáng)制轉(zhuǎn)換頁(yè)面(不可少,否則刷新仍會(huì)重復(fù)提交,仍轉(zhuǎn)到本頁(yè)),

     通過(guò)頁(yè)面的轉(zhuǎn)換將緩存中的提交的數(shù)據(jù)都釋放了,即提交的標(biāo)單數(shù)據(jù)不會(huì)被保存到緩存里,

     如果后退的話,將會(huì)出現(xiàn)該頁(yè)無(wú)法顯示

     Response.Redirect("post.aspx");

  }

}


上面這個(gè)方法非常簡(jiǎn)單也很實(shí)用,推薦大家使用。

下面是我自己研究出來(lái)的另一種方法,該方法不同于“不保存緩存的方法”,它是讓瀏覽器保存所有頁(yè)面緩存的。該方法通過(guò)隨機(jī)碼的方式 來(lái)判斷是正常提交還是“刷新”或“后退”的。

首先(提交頁(yè)面是post.aspx)在 Session 中 增加變量 Rnd 用來(lái)存放隨機(jī)碼,同時(shí)在提交表單數(shù)據(jù)時(shí)不做處理,而是讓頁(yè)面轉(zhuǎn)到 post.aspx?r=x,這里“x”等于Session["Rnd"],這個(gè)時(shí)候在頁(yè)面加載時(shí),通過(guò)判斷r的值和Session["Rnd"]的值是否相同,如果相同就處理提 交的數(shù)據(jù),否則即可認(rèn)為是“刷新”或者是“后退”操作了,最后再次付給Session["Rnd"]一個(gè)隨機(jī)碼。

以下是該方法代碼(post.aspx):

復(fù)制代碼 代碼如下:

//獲取隨機(jī)碼

public class MyRnd

{

   public static string Rnd()

   {

     //隨機(jī)碼是由 0-9 a-z A-Z 之間的數(shù)字或字母組成的

     //下面是生成的20位隨機(jī)碼

     //0..9 A..Z a..z

     //48-57 65-90 97-122

     string rst = "";

     Random rr = new Random();

     for (int i = 0; i < 20; i++)

     {

       int ir = 0;

       do

       {

         ir = rr.Next(123);

         if((ir >= 48) && (ir <= 57)) break;

         else if((ir >= 65) && (ir <= 90)) break;

         else if ((ir >= 97) && (ir <= 122)) break;

       }

       while (true);

       rst += ((char)ir).ToString();

       }

     return rst;

   }

}

//頁(yè)面加載

protected void Page_Load(object sender, EventArgs e)

{

   //獲取URL中請(qǐng)求的“r”值,如果“r”不存在則 r=""

   string r = "";

   if(Request.QueryString["r"] != null)

     r = Request.QueryString["r"].ToString().Trim();

   string t;

   //獲取 “Session” 中的 “Rnd” 值,用于和“r”比較

   t = Session["Rnd"].ToString().Trim();

   //如果“r=t”則為提交操作,即可對(duì)表單的數(shù)據(jù)進(jìn)行處理

  if(r == t)

  {

     if (txtTitle.Text.ToString().Trim() == "")

       ShowMsg.Text = " * 標(biāo)題不能為空!";

     else if (txtText.Text.ToString().Trim() == "")

       ShowMsg.Text = " * 內(nèi)容不能為空!";

     else      {

       //這里是將數(shù)據(jù)提交到數(shù)據(jù)庫(kù)中,省略

       /*

       string sql = "insert into tab...values(...)";

       MyConn.ExecQuery(sql);

       */

       //提交成功后清空表單數(shù)據(jù)

       txtTitle.Text = "";

       txtText.Text = "";

       //顯示提交成功信息

       ShowMsg.Text = " * 提交成功!";

     }

  }

   //否則可以認(rèn)為是“刷新”或者“后退”操作

   else

   {

       txtTitle.Text = "";

       txtText.Text = "";

  }

  //最后要重新獲得“Session["Rnd"]”的值,并將“btnOK.PostBackUrl”設(shè)為“Session["Rnd"]”的值

  Session["Rnd"] = MyRnd.Rnd();

  btnOK.PostBackUrl ="post.aspx?r=" + Session["Rnd"].ToString().Trim();

}

//這里提交按鈕(btnOK)單擊事件就不需要寫(xiě)任何代碼了


通過(guò)這種方法,每次加載頁(yè)面時(shí)“Session["Rnd"]”都將得到一個(gè)新的值,而在刷新或后退時(shí)就不會(huì)得到相同的“r”和“t”值,數(shù)據(jù)也就 不會(huì)被重復(fù)提交,只有通過(guò)“btnOK”來(lái)提交的操作才會(huì)得到“r==t”,數(shù)據(jù)才會(huì)被提交處理的,通過(guò)判斷隨機(jī)碼的方式來(lái)阻止刷新重復(fù)提交就 可以實(shí)現(xiàn)了。

相關(guān)文章

  • c#多圖片上傳并生成縮略圖的實(shí)例代碼

    c#多圖片上傳并生成縮略圖的實(shí)例代碼

    今天寫(xiě)了一個(gè)上傳多張圖片并生成縮略圖的小程序。當(dāng)然因?yàn)槭遣锁B(niǎo),所以寫(xiě)的一般。但還是學(xué)到了不少東西?,F(xiàn)在上代碼。
    2013-04-04
  • Image顯示服務(wù)器上任意絕對(duì)路徑下的圖片(采用二進(jìn)制流實(shí)現(xiàn))

    Image顯示服務(wù)器上任意絕對(duì)路徑下的圖片(采用二進(jìn)制流實(shí)現(xiàn))

    有這樣一個(gè)需求:數(shù)據(jù)庫(kù)中存儲(chǔ)的是照片所在的絕對(duì)路徑(可以不在系統(tǒng)所在路徑下),Image控件動(dòng)態(tài)加載路徑下的圖片,另類實(shí)現(xiàn)方法,感興趣的朋友可以參考下,或許本文對(duì)你學(xué)習(xí)二進(jìn)制流有所幫助
    2013-02-02
  • Asp.Net中索引器的用法分析

    Asp.Net中索引器的用法分析

    這篇文章主要介紹了Asp.Net中索引器的用法,以實(shí)例形式詳細(xì)分析了Asp.Net中索引器的定義、屬性與具體使用方法,并附帶說(shuō)明了相關(guān)的注意事項(xiàng),在asp.net項(xiàng)目開(kāi)發(fā)中有不錯(cuò)的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-11-11
  • MVC4制作網(wǎng)站教程第四章 部分欄目功能實(shí)現(xiàn)代碼

    MVC4制作網(wǎng)站教程第四章 部分欄目功能實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了MVC4制作網(wǎng)站教程,部分欄目功能實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • JavaScript系列之―同步還是異步?

    JavaScript系列之―同步還是異步?

    JavaScript系列之―同步還是異步?...
    2007-03-03
  • ASP.NET數(shù)據(jù)庫(kù)操作類實(shí)例

    ASP.NET數(shù)據(jù)庫(kù)操作類實(shí)例

    這篇文章主要介紹了ASP.NET數(shù)據(jù)庫(kù)操作類,結(jié)合實(shí)例形式分析了asp.net基本的數(shù)據(jù)庫(kù)增刪改查操作封裝相關(guān)技巧,需要的朋友可以參考下
    2017-03-03
  • LiteralControl ASP.NET中的另類控件

    LiteralControl ASP.NET中的另類控件

    對(duì)于LiteralControl控件的應(yīng)用比較少,今天突然看到了,就弄個(gè)明白為好,所以總結(jié)出來(lái),供大家一起學(xué)習(xí)
    2012-01-01
  • net core下鏈路追蹤skywalking安裝和簡(jiǎn)單使用教程

    net core下鏈路追蹤skywalking安裝和簡(jiǎn)單使用教程

    本文將從0開(kāi)始搭建兩個(gè)webapi項(xiàng)目,使用Skywalking來(lái)追蹤他們之間的調(diào)用關(guān)系及響應(yīng)時(shí)間,開(kāi)發(fā)環(huán)境為VisualStudio2019,對(duì)net core 鏈路追蹤skywalking安裝和使用教程感興趣的朋友一起看看吧
    2021-10-10
  • 使用微信PC端的截圖dll庫(kù)實(shí)現(xiàn)微信截圖功能

    使用微信PC端的截圖dll庫(kù)實(shí)現(xiàn)微信截圖功能

    這篇文章主要為大家詳細(xì)介紹了使用微信PC端的截圖dll庫(kù)實(shí)現(xiàn)微信截圖功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 禁止ViewState的3種解決方法

    禁止ViewState的3種解決方法

    默認(rèn)情況下,ViewState是被啟用的,比如提交表單后,表單中輸入的值會(huì)自動(dòng)保留。但是如果不需要保留,也可以將其禁用,這樣可以節(jié)省資源。
    2013-03-03

最新評(píng)論