2013-11-01 5 views
1

EventHandler에서 preserveForm이 true 인 서버 전송은 이벤트 처리기를 다시 작성하고 무한 루프를 발생시킵니다. 내 질문 : 처리기에서 이벤트가 처리되었음을 어떻게 나타낼 수 있습니까?EventHandler에서 preserveForm이 true 인 서버 전송은 해당 이벤트를 처리합니다. 핸들러

추신 : 나는 우리가 preserveForm을 false로 설정할 수 있다는 것을 알고 있지만 그렇게하고 싶지 않습니다.

샘플 코드 : 바로 지금 직면하고있어

protected void rbThemes_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    Server.Transfer(Request.FilePath, true); 
} 

답변

0

위대한 질문입니다. 나는 대답을 모른다. 나는 이것을 깨끗하게 처리하는 방법을 모르지만, 이벤트를 제거하기 위해 Request.Form 데이터를 수정할 것이라고 상상한다.

해결 방법으로 보존 된 Context.Items에 보호 플래그를 사용합니다.

protected void rbThemes_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (IsSecondPass()) return; 
    Server.Transfer(Request.FilePath, true); 
} 

private bool IsSecondPass() 
{ 
    const string key = "SECOND_PASS_GUARD"; 
    if (Context.Items[key] == null) 
    { 
     Context.Items[key] = new object(); 
     return false; 
    } 
    else 
    { 
     Context.Items.Remove(key); 
     return true; 
    } 
} 

이 기능은 권장하지 않지만 작동합니다. (방법 이름도 매우 저조한 부작용으로 선택됩니다.)

또한 짧은 방법이있다 :

protected void rbThemes_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (PreviousPage != null) return; 
    Server.Transfer(Request.FilePath, true); 
} 

당신이 교차 다른 종류의 할 경우 어떤 바람직하지 않은 효과가 발생하지 않는 것을주의 (다른 페이지에서 SelectedIndexChanged 이벤트를 교차 게시하는 이유 또는 방법을 모르지만). 여전히 권장하지 않습니다.

참고 : 마스터 페이지를 코딩하는 경우 마스터 페이지 클래스 (Page.PreviousPage)의 Page 속성에서 PreviousPage을 참조해야합니다.