2011-05-16 13 views
6

asp.net에서 다시 발생합니다. 데이터가 다시 전송됩니까? 페이지로드시 페이지 새로 고침 이벤트를 트랩하는 C#의 방법이 있습니까 ??새로 고침 페이지가 양식을 제출하고 새로 고침 할 때

+0

브라우저에서 F5 키를 눌러 페이지를 새로 고치고 있습니까? –

+0

예, 그럴 경우 이전에 해고 된 이벤트가 다시 발생합니다. – Paras

답변

7

ASP.NET에서는 직접 수행 할 방법이 없습니다. 제출 후

  1. 리디렉션 :

    중복 제출을 방지하기 위해, 다른 한편으로는, 몇 가지 기술이있다. 이것은 최악의 경우입니다. 중복 제출을 피할지라도 사용자 관점에서 볼 때 현대 웹 응용 프로그램에서는 허용되지 않습니다.

  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

브라우저에서 페이지를 새로 고치기 때문에 문제가되지 않는다고 생각합니다. –

+0

@Muhammad Akhtar : 예, 고마워요. 나는이 질문에 대해 완전히 오해했습니다. 이제 답이 편집됩니다. –

+0

그냥 생각. 같은 페이지로 리디렉션하면 어떨까요? 허용 된 접근 방식인가? – Malik

1

, 그것은 당신의 마음에 어떤 지점이있는 경우, 다음과 같은 코드를 추가하여이 작업을 수행 할 텍스트 상자 등의 모든 텍스트를 제거 페이지를 다시로드, 자동으로 양식을 제출 한 후 페이지 자체를 새로 만들기 ->Page.Redirect(Request.RawUrl);을 제출 메소드 하단에 추가하십시오.

-1

예 : '버튼'을 클릭하면 시스템에서 'button_click'이벤트를 catch합니다. 페이지를 새로 고치면 시스템에서 동일한 이벤트를 다시 실행합니다. 이벤트 삽입에, t이 문제를 돈합니다 : 를 이벤트에

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

당신이 무슨 의미입니까?

+0

이 답변의 다른 사본과 마찬가지로, 이것은 질문과 관련이 없습니다. –

0

동일한 문제가 발생하여 세션 추적으로 해결했습니다. 그리고 난 쉬운이 문제를 해결하는 방법 시간이 덜 것 같아요.