2013-04-02 3 views
2

시나리오

I는 (등 폼/윈도우 인증을 사용하여 대) 지정 인증/인증 방법을 사용하는 ASP.NET 프로젝트가있다. 각 보안 페이지로드에서 다음 코드가 실행됩니다비동기 포스트 백 중에 브라우저를 리디렉션하는 방법은 무엇입니까?

protected void Page_Load(Object sender, EventArgs e) 
{ 
    if (!IsLoggedIn) 
    { 
     HttpContext.Current.Response.Redirect("~/Login/", true); 
    } 
} 

이 코드는 기본적으로 사용자가 (등, 로그 아웃하지 만료 된 ASP.NET 세션)에 로그인 여전히 여부를 확인; 사용자가 로그인하지 않은 경우 Response.Redirect()이 발생하여 로그인 페이지로 전송됩니다.

이 시나리오 은 사용자가 전체 페이지 (링크 또는 직접 URL을 통해)를 요청하면 완벽하게으로 작동합니다. 비동기 포스트 백을 사용할 때 문제가 발생합니다.

클릭하면 비동기 포스트 백이 발생하는 <asp:UpdatePanel> 내부에 버튼이 중첩되어 있습니다. 이 버튼은 <asp:Label />을 업데이트합니다. 예를 들면 :

<!-- the button --> 
<asp:LinkButton ID="MyButton" CausesValidation="false" Text="My Button" OnClick="MyButton_Click" runat="server" /> 

<!-- the label --> 
<asp:Label ID="MyLabel" runat="server" /> 
protected void MyButton_Click(Object sender, EventArgs e) 
{ 
    MyLabel.Text = DateTime.Now.ToString(); 
} 

문제 비동기 포스트 백이 실행

IsLoggedIn 거짓, 요청이 로그인 페이지로를 재 입니다. 이제 ASP.NET 프레임 워크는 HTML 페이지가 아닌 특정 응답을 기대합니다. 따라서, 다음과 같은 오류를 던지고 :

enter image description here

가 어떻게이 문제를 해결할 수

질문? 비동기 포스트 백 동안 코드 숨김에서 특정 주소로 전체 페이지 리디렉션을 강제 적용하려면 어떻게합니까?

답변

3

을 당신이 발동하려면 코드 숨김이 작업을 수행 할 수 있습니다

if (ScriptManager.GetCurrent(Page).IsInAsyncPostBack) { 
    ScriptManager.RegisterStartupScript(updatepanelid, typeof(string), "redirect", "window.location = 'http://www.google.com';", true); 
} else { 
    Response.Redirect("http://www.google.com"); 
} 

window.open()을 사용하는 경우 팝업 창이 열립니다 (차단되거나 차단되지 않을 수도 있음).window.location = "someurl";을 사용하면 클라이언트 측 리디렉션 만 수행합니다.

+0

당신의 대답이 원하는 결과를 얻기위한 가장 적절한 * 방법이지만, 나는 그보다 조금 더 ** 더 ** 필요합니다. ** 현재 상태에서 페이지 라이프 사이클을 방해해야한다. (Response.Redirect ("path", true)와 같다). 이 추가 세부 정보를 제공하는 추가 답변을 게시했습니다. – Jesse

0

일부 오해가 있습니다. "비동기 포스트 백"은 기술적으로 포스트 백이 아닙니다. xmlHttpRequest입니다. 여기서 리디렉션을 수행하려면 window.open()을 사용하여 자바 스크립트에서 ajax 콜백 함수로 수행해야합니다.

asp.net AJAX를 사용하여 구현하는 방법을 잘 모르겠습니다. 서버에서 xmlHttpRequest 코드를 실행하는 동안 은 클라이언트 (리디렉션 - 일 수 있습니다.)를 리디렉션 할 수 없지만은 리디렉션됩니다. 사용자가 응답 한 HTML은 asp.NET의 javascript로 잘못 구문 분석됩니다 .. 아약스 코드

jQuery로

, 이것은 의사 해결책이 될 것입니다

$.ajax({ 
    success: function(data) { 
     if (data == 'redirect') { 
      window.open('yourRedirectUrl'); 
     } 
    } 
}); 
+1

감사 - 불행히도, 난 단지 사용하고 있습니다 이 용어는 ASP.NET WebForms 세계에서 널리 사용됩니다. 이러한 리디렉션을 잡으려면 어떻게해야합니까? 보시다시피 의도적 인 리디렉션이 아닌 인증/인증의 부작용입니다. – Jesse

4

Kenneth's answer은 리디렉션하는 적절한 방법이지만, 좀 더 자세한 내용이 필요합니다. 사용자 지정. 비동기 포스트 백 동안

, 나는 Response.Redirect("path", true)을 시뮬레이션하는 데 필요한 - true 매개 변수 는 (현재 페이지의 실행을 종료할지 여부를 나타냅니다) 내가 복제하는 데 필요한 중요한 것입니다! 단순히 Response.End()ScriptManager.RegisterClientScriptBlock() 뒤에 사용하면 브라우저에 응답이 다시 전송되지 않기 때문에 작동하지 않습니다. 비동기 포스트 백에 대한 서버 응답을 분석하여

, 나는 (A Response.Write를 사용하여 응답 시뮬레이션) 다음과 같은 해킹을 사용하는 의지 : 용어에 대한 설명에 대한

String jsRedirect = String.Format("window.location.pathname = '{0}';", VirtualPathUtility.ToAbsolute(url)); 

Response.Write(
    // required parameters! 
    "0|asyncPostBackControlIDs|||" + 
    "0|postBackControlIDs|||" + 
    "0|updatePanelIDs|||" + 
    "0|childUpdatePanelIDs|||" + 
    "0|panelsToRefreshIDs|||" + 

    // your custom JavaScript 
    String.Format("{0}|scriptBlock|ScriptContentNoTags|{1}|", jsRedirect.Length, jsRedirect) 
); 
Response.Flush(); 
Response.End(); 
+0

위대한 답변과 훌륭한 답변. 실제로, 현재 요청의 처리를 중단하려는 제약 조건으로 허용 된 대답이어야합니다. – Oliver