2011-05-16 98 views
6

IN asp.net當我提交表單並刷新它時,數據又重新提交了? 有沒有在C#中的方式來捕獲頁面加載頁面刷新事件?頁面刷新再次發射事件

+0

你刷新瀏覽器中按F5的頁面?? – 2011-05-16 07:24:18

+0

是的,當我這樣做時,先前觸發的事件再次被觸發 – Paras 2011-05-16 07:26:47

回答

7

ASP.NET不提供直接執行此操作的方法。

有一些技巧,而另一方面,爲了避免重複提交:

提交後
  1. 重定向。這是最糟糕的一個。即使它避免了重複提交,但從用戶的角度來看,它在現代Web應用程序中是不可接受的。

  2. 按表格提交的跟蹤提交,每個會話。當用戶第一次提交表格時,請在會話中記住這一點。如果發生了另一個提交,請嘗試確定它是否必須被丟棄(在某些情況下,它不能;例如,如果我在StackOverflow上編輯我的答案一次,如果需要,我可以做兩次)。

  3. 在第一次提交後禁用JavaScript提交。這樣可以避免在用戶雙擊提交按鈕或第一次點擊提交按鈕時等待並認爲表單未提交,從而第二次點擊的情況。當然,不要依賴這一點:JavaScript可能被禁用,它可以在雙擊上工作,但不能在F5刷新上工作,並且在所有情況下這種技術都不是完全可靠的。

作爲一個例子,我們試着實現第二個。

假設我們有一個評論框this.textBoxComment,它允許用戶在博客的頁面上添加新評論。提交是這樣完成的:

private void Page_Load(object sender, System.EventArgs e) 
{ 
    if (this.IsPostBack) 
    { 
     string comment = this.ValidateCommentInput(this.textBoxComment.Text); 
     if (comment != null) 
     { 
      this.databaseContext.AddComment(comment); 
     } 
    } 
} 

如果用戶點擊兩次,評論將被髮布兩次。

現在,讓我們添加一些會話跟蹤:

private void Page_Load(object sender, System.EventArgs e) 
{ 
    if (this.IsPostBack) 
    { 
     if (this.Session["commentAdded"] == null) 
     { 
      string comment = this.ValidateCommentInput(this.textBoxComment.Text); 
      if (comment != null) 
      { 
       this.databaseContext.AddComment(comment); 
       this.Session.Add("commentAdded", true); 
      } 
     } 
     else 
     { 
      // TODO: Inform the user that the comment cannot be submitted 
      // several times. 
     } 
    } 
} 

在這種情況下,用戶將能夠提交評論只有一次。其他評論將被自動丟棄。

問題是,用戶可能想要添加評論到幾個博客文章。我們有兩種可能的方式來實現這一點。最簡單的方法是在每個非回發請求上重置會話變量,但是這會允許用戶在一個頁面上提交帖子,加載另一個頁面,而不是在第一個頁面上點擊刷新,從而提交評論兩次,但不提交能夠在第二頁上添加評論。

private void Page_Load(object sender, System.EventArgs e) 
{ 
    if (this.IsPostBack) 
    { 
     if (this.Session["commentAdded"] == null) 
     { 
      string comment = this.ValidateCommentInput(this.textBoxComment.Text); 
      if (comment != null) 
      { 
       this.databaseContext.AddComment(comment); 
       this.Session.Add("commentAdded", true); 
      } 
     } 
     else 
     { 
      // TODO: Inform the user that the comment cannot be submitted 
      // several times. 
     } 
    } 
    else 
    { 
     this.Session.Remove("commentAdded"); 
    } 
} 

更高級的是在會話中跟蹤提交評論的頁面列表。

private void Page_Load(object sender, System.EventArgs e) 
{ 
    List<string> commentsTrack = this.Session["commentAdded"] as List<string>; 
    string blogPostId = this.ValidatePostId(this.Request.QueryString["id"]); 
    if (blogPostId != null) 
    { 
     if (this.IsPostBack) 
     { 
      this.AddComment(commentsTrack); 
     } 
     else 
     { 
      if (commentsTrack != null && commentsTrack.Contains(blogPostId)) 
      { 
       commentsTrack.Remove(blogPostId); 
      } 
     } 
    } 
} 

private void AddComment(List<string> commentsTrack) 
{ 
    if (commentsTrack == null || !commentsTrack.Contains(blogPostId)) 
    { 
     string comment = this.ValidateCommentInput(this.textBoxComment.Text); 
     if (comment != null) 
     { 
      this.databaseContext.AddComment(comment); 
      if (commentsTrack == null) 
      { 
       commentsTrack = new List<string>(); 
      } 

      commentsTrack.Add(blogPostId); 
      this.Session["commentAdded"] = commentsTrack; 
     } 
    } 
    else 
    { 
     // TODO: Inform the user that the comment cannot be submitted 
     // several times. 
    } 
} 
+0

我認爲這不是問題,因爲他在瀏覽器中刷新頁面。 – 2011-05-16 07:25:06

+0

@Muhammad Akhtar:是的,謝謝,我完全誤解了這個問題。現在編輯答案。 – 2011-05-16 07:33:01

+0

只是一個想法。如果我們將其重定向到同一頁面,該怎麼辦?接受的方法與否? – Malik 2011-06-15 09:35:10

1

,你可以,如果它在你的心中的任何一點,使頁面刷新自身提交表單後自動重新加載去除文本框等所有文本您可以通過添加以下代碼做到這一點的頁面 - >Page.Redirect(Request.RawUrl);在提交方法的底部。

-1

例如: 如果您點擊'按鈕'系統將捕獲事件'button_click'。 如果刷新頁面,系統將再次執行相同的事件。 穿上噸有這個問題,在事件插入: 了你的活動

private void button_click(object sender, System.EventArgs e) 
{ 
    button.Enabled =false; 
    button.Enabled =true; 
} 

是你的意思?

+0

與你的這個答案的其他副本一樣,這不是問題所在。 – 2013-10-23 13:58:35

0

我得到同樣的問題,我解決了會話跟蹤。 而我認爲這是容易較少耗時方式來解決這個問題。