2012-07-09 57 views
1

我不確定我是否在正確的區域,但我會試試這個。做一個用戶回發的按鈕

我有一個頁面後面帶有C sharp代碼的asp.net頁面,我有一個提交按鈕來保存頁面上的表單。現在我的問題是,我有500個用戶沒有任何問題,1個用戶需要點擊5或6次才能觸發它。它會每次回發但不會保存。

我可以發表一些代碼,如果需要的話,我已經看過一切,她的記錄和計算機沒有什麼不同,那麼其他人只是在尋找想法。

全部和歡迎任何幫助謝謝大家。

編輯:

所有用戶必須使用IE7或後面更好

<asp:Button ID="button" runat="server" /> 

代碼:

protected override void OnInit(EventArgs e) 
{ 
    button.EnableViewState = true; 

    InitializeComponent(); 
    base.OnInit(e); 
} 

private void InitializeComponent() 
{ 
    this.button.Click += new EventHandler(this.button_Click); 
} 

protected void button_Click(object sender, EventArgs e) 
{ 
    if (((Session["value"] == null) || (Session["value"] == ""))) 
    { 
     Response.Redirect("login.aspx"); 
    } 
    else 
    { 
     checkNoteValues("Inc"); 
    } 
} 
+4

你肯定會需要添加一些代碼... – algiecas 2012-07-09 19:16:49

+3

信息對他們所使用也可以證明是有益的瀏覽器。 – 2012-07-09 19:17:41

+0

這可能只是一個糟糕的連接 - 格式錯誤的請求會顯示回傳,但無法解密。 – Hogan 2012-07-09 19:17:47

回答

1

您可以:

  1. 鎖用DIV屏幕;
  2. 點擊後禁用按鈕;
  3. 使用「同步器令牌」模式;

選項1和2容易受到一個(或多個)頁面重新加載(F5)的影響。方案3更強大,理論上是萬無一失的。

不久我會後示例代碼1和3

編輯:

Helper類爲 「同步令牌」

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; 

namespace TestDivLockScreen 
{ 
    /// <summary> 
    /// Helper to "Synchronizer Token Pattern". 
    /// </summary> 
    public class SynchronizerToken 
    { 
     private static readonly string SESSION_KEY_TOKEN = "TestDivLockScreen.SynchronizedToken.SESSION_KEY_TOKEN"; 

     /// <summary> 
     /// Returns a new token and positions it for validation of next request. 
     /// </summary> 
     /// <returns></returns> 
     public static string NewToken() 
     { 
      string token = Guid.NewGuid().ToString("N"); 
      HttpContext.Current.Session.Add(SESSION_KEY_TOKEN, token); 
      return token; 
     } 

     /// <summary> 
     /// Returns the value of the current token. Renew if the current token is null. 
     /// </summary> 
     /// <returns></returns> 
     public static string CurrentToken() 
     { 
      string token = HttpContext.Current.Session[SESSION_KEY_TOKEN] as string; 
      if (string.IsNullOrEmpty(token)) 
      { 
       token = NewToken(); 
      } 

      return token; 
     } 

     /// <summary> 
     /// Checks if the token matches the token of last call to NewToken. 
     /// The removal of the token is only made after a new call NewToken. 
     /// </summary> 
     /// <param name="token"></param> 
     /// <returns></returns> 
     public static bool IsCurrentToken(string token) 
     { 
      string currentToken = HttpContext.Current.Session[SESSION_KEY_TOKEN] as string; 
      if (currentToken == null) 
      { 
       return false; 
      } 
      else 
      { 
       if (currentToken.Equals(token)) 
       { 
        return true; 
       } 
       else 
       { 
        return false; 
       } 
      } 
     } 

     /// <summary> 
     /// Do the same as IsCurrentToken. However loads a new "token value" 
     /// in the session. Is "Thread Safe"! 
     /// </summary> 
     /// <param name="token"></param> 
     /// <returns></returns> 
     public static bool IsCurrentTokenRenew(string token) 
     { 
      lock (HttpContext.Current.Session) 
      { 
       string currentToken = CurrentToken(); 
       NewToken(); 
       if (currentToken.Equals(token)) 
       { 
        return true; 
       } 
       else 
       { 
        return false; 
       } 
      } 
     } 
    } 
} 

定義頁面上的隱藏字段:

<asp:HiddenField ID="HdfSyncToken" runat="server" /> 

代碼背後:

protected void Pre_Render(object sender, EventArgs e) 
{ 
    //repositioning token 
    this.HdfSyncToken.Value = SynchronizerToken.CurrentToken(); 

    //Refresh GridView 
    this.GrvRecords.DataSource = this.Records; 
    this.GrvRecords.DataBind(); 
} 

protected void BtnInsertST_Click(object sender, EventArgs e) 
{ 
    //Abort second execution for the same value of the token 
    if (!SynchronizerToken.IsCurrentTokenRenew(this.HdfSyncToken.Value)) 
    { 
     ClientScript.RegisterStartupScript(this.GetType(), "alert", "<script type='text/javascript'>alert('Request has already been answered!');</script>"); 
    } 
    //Insert Record (token validation OK) 
    else 
    { 
     this.InsertRecord(); 
    } 
} 

Conplete源(VS2005):q_11402631.7z