簡體   English   中英

重新發送有關刷新ASP.Net中的頁面的消息

[英]Resend message on refreshing the page in ASP.Net

我已經創建了一個表單,用於向管理員發送消息,當我單擊“發送”按鈕時,一切正常,數據已發送並保存到數據庫,然后打印成功消息。 但是,如果我刷新頁面-通過按F5鍵 -消息將再次發送到服務器和數據庫! 我該如何解決這個問題?

我只想在單擊“發送”按鈕而不是在刷新頁面上向服務器發送一次消息。

我的代碼是

<asp:Button ID="btnsenddata" runat="server" OnClientClick="return validate()" OnClick="btnsenddata_Click" Text="SendData" />



        protected void btnsenddata_Click(object sender, EventArgs e)
        {

           //this place i connect to DB

        }

我會在按鈕上放置一個OnClick處理程序。 因此,在您的.asp文件中<asp:Button id="btnMyButton" runat="server" OnClick="btnMyButton_Click"

然后在aspx.cs端添加方法'btnMyButton_Click'並將代碼放入其中

btnMyButton_Click(object sender, EventArgs e)
{
   //your code to update database goes here
}

您將必須想出某種方法(可能在數據庫中),以確保在一定時間內不會發送重復的消息。 您無法輕松解決F5問題,因為所有這些都告訴瀏覽器重復上一次的操作。 這意味着將相同的數據發送給用戶。 這就是訣竅,因為客戶端將僅重播上一個操作,所以您進行的任何檢查都必須將數據存儲在服務器內。

您可以持有一個會話變量,以使您知道用戶上次發送此表單的時間(只要確保您在檢查會話變量時檢查Session [“ sentform”]!= null)即可

另外,您可以在數據庫中創建一個簡單的日志,以說出用戶單擊了什么(如果已登錄用戶),上次發送的時間以及可以讓您確定觸發了消息請求者的頁面的內容。 然后,您可以詢問數據庫該用戶是否在過去的幾分鍾內發送了有關頁面/進程X的消息,並返回true或false。

這是一個普遍的問題。 行為是設計使然:刷新頁面時,實際上已將按下的按鈕的信息重新發送到服務器(以及控件的所有其他信息)。 我在上網時發現的一種不錯的解決方法是(使用這種方式在服務器端)使用HashTable:

//Class member   
HashTable ht = new HashTable();

btnMyButton_Click(object sender, EventArgs e)
{
      ht =(Hashtable)Application["UserOKHashtable"]
      if ((ht.ContainsKey(Session["UserSessionKey"]))            
        {
          // double - clicked or user pressed refresh
          return;
        }
        else
        {
         (ht.Add(Session["UserSessionKey"],UserName);
        // your code here
        // and finally
        ((Hashtable)Application["UserOKHashtable"])
         .Remove(Session["UserSessionKey"]);
        }
       }

請記住,在此過程結束時,從哈希表中刪除用戶的會話密鑰,否則用戶在整個會話期間只能單擊一次按鈕。

如果您搜索“ prevent double post”,您將找到更多信息以及可能的解決方法。

希望對您有所幫助:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM