2011-09-13 7 views
5

ASP.net MVC3의 컨텍스트에서 특정 URL로 리디렉션하려고하는 컨트롤러 동작에이 코드 줄이 있습니다.리디렉션 (URL) 작동하지 않음

return Redirect(returnUrl); 

returnUrl은 "/ Home/Index /"가 포함 된 문자열입니다. 어떤 이유로 리디렉션이 일어나지 않고 동일한 화면에 남아 있습니다. 나는 후행 슬래시를 제거하려했지만 성공하지 못했습니다. 리디렉션이 발생하지 않는 이유는 무엇입니까?

답변

13

Redirect 메서드는 사이트의 외부 URL로 리디렉션하고 절대 URL을 전달하는 데 사용됩니다. 당신이 당신의 위치에 속하는 다른 컨트롤러 액션로 리디렉션해야하는 경우는이를 사용하는 것이 더 없을 것입니다 : 당신이 더 이상 URL을 하드 코딩하고 코드가 경로 변화에 덜 취약

return RedirectToAction("Index", "Home"); 

이 방법.

AJAX로이 리다이렉트를 수행하는 컨트롤러 동작을 호출하는 경우, 브라우저를 임의의 위치로 리다이렉트 할 수는 없다는 것을 알 수 있습니다.> 분명히 같은 페이지에 머무를 것입니다. AJAX 요청은 모든 리디렉션에 이어 성공하고 success 콜백에서는 AJAX없이 요청 된 것처럼 /Home/Index url의 최종 HTML을 가져옵니다.

당신이 AJAX의 성공 콜백에 재 지정하려면 예를 들어, 컨트롤러 액션 수익을 가질 수 전화 당신이 리디렉션 할 대상 URL을 나타내는 JSON 개체 :

return Json(new { redirectToUrl = Url.Action("Index", "Home") }); 

하고 콜백을 window.location.href 기능을 사용하면 유효한 로그온 자격 증명을 제공 한 후 같은 로그인 화면에 붙어있는 경우

success: function(result) { 
    window.location.href = result.redirectToUrl; 
} 
+0

먼저 모든 답변을 드리겠습니다. 여기 AJAX를 사용하지 않으므로 회신의 두 번째 부분을 배제 할 수 있습니다. 이상 적으로는 RedirectToAction()을 사용하고 싶지만 여기서 returnUrl을 원래 요청한 페이지로 가져 오는 인증을 사용하고 있습니다. 이 원래 요청은 응용 프로그램의 모든 페이지가 될 수 있습니다. 컨트롤러와 액션을 RedirectToAction()으로 하드 코딩 할 수는 없습니다. 문자열 조작 기술을 사용하여 returnUrl에서 Controller와 Action 파트를 처리하는 옵션이 있습니다. (심지어 매우 어려울 것입니다.)하지만 더 나은 솔루션. – Jatin

+0

@Nirvan 대신 returnUrl 문자열 변수를 보내면 컨트롤러와 액션 인 2 개의 변수를 보냅니다. 이렇게하면 필요한 URL을 만들 수 있습니다. 그렇지 않다면'http : // yoursite.com/home/index'와 같은 리디렉션으로 절대 URL을 사용해보십시오. –

+0

@Darain, 죄송합니다. 인증 정보에 대해서는 분명히 알지 못했습니다. 기본적으로 asp.net 인증은 로그인하기 전에 원래 요청 된 페이지를 추적합니다. 나는 returnUrl을 채우지 않는다. 예를 들어 사용자가 로그인하기 전에/Home/Index에 액세스하려고한다고 가정합니다. Asp.net 인증 단계는 내 응용 프로그램의 로그인 페이지로 들어가서 리디렉션합니다. 여기서 서버는 returnUrl을 "/ Home/Index"로 채 웁니다.따라서 원래 요청한 페이지의 URL을 포함하는 로그인 컨트롤러에서 문자열 (regurnUrl) 만 얻는 것을 볼 수 있습니다. – Jatin

2

을, 당신이 폼 인증 쿠키를 설정하지 않은 수 있습니다. 그렇지 않으면 클라이언트는 사용자처럼 취급,

이 보장
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 
return RedirectToLocal(returnUrl); 

, 쿠키가 재 지정하기 전에 설정 : 당신이 당신의 로그인 actionmethods에 리디렉션 또는 RedirectToLocal를 사용할 때마다

, 당신이 다음과 같은 순서로 호출 할 수 있도록 로그인하지 않았습니다.

감사합니다.