2010-05-12 6 views
25

기존 ASP 및 ASP.NET 웹 폼에서 response.redirect를 사용했습니다. 그러나 MVC 2.0에서는 뭔가 특별한 것을 실행하고 있습니다.ASP.NET MVC에서 response.redirect는 어떻게 작동합니까?

컨트롤러 메서드에 여러 가지 컨트롤러 메서드가 일부 정보를로드하고 유효성을 검사하는 데 사용하는 개인 메서드가 있습니다. 이 개인 메서드는 문제가 일반적인 오류 메시지 페이지로 발견되면 리디렉션하도록 설정됩니다.

큰 문제는 호출하는 컨트롤러 클래스와 페이지 뷰가 실제로 리디렉션되기 전에 렌더링 및로드를 완료하려고한다는 것입니다. View에서 일반적인 오류 페이지가 마침내로드되기 전에 무시해야하는 예외가 발생하기 때문에 개발시 귀찮습니다.

위에서 언급했듯이 나는 새 페이지가로드 될 때 페이지의 후속 코드가 실행되지 않도록하는 response.redirect의 이전 모델에 익숙하다.

MVC의 리디렉션에 대한 도움이나 조언은 크게 감사하겠습니다.

+1

코드를 알려주십시오. – SLaks

+0

"Fiddler"라는 진단 도구에 대해 들어 보셨습니까? 귀하의 페이지가 무엇을하고 있는지를 알면 매우 유용 할 것입니다. –

+0

개인적인 방법으로'응답. 리디렉션 '이라고 부릅니다. –

답변

42

종래의 메커니즘은 클라이언트 RedirectResult 유형의 객체를 반환한다. View 메서드가 호출되기 전에이 작업이 완료되면 뷰 메서드가 호출되지 않습니다.

직접 Response.Redirect를 호출하면 Asp.Net MVC의 프론트 컨트롤러가이를 수행하는 대신 컨트롤러 메소드가 완료되거나 예외가 발생할 때까지 계속 수행됩니다.

문제의 관용적 인 해결책은 개인용 메서드가 컨트롤러에서 사용할 수있는 결과를 반환하도록하는 것입니다. 예를 들어

:

public ActionResult Edit(MyEntity entity) 
{ 
    if (!IsValid()) return Redirect("/oops/"); 
    ... 
    return View(); 

} 

private bool IsValid() 
{ 
    if (nozzle==NozzleState.Closed) return false; 
    if (!hoseAttached) return false; 
    return (userRole==Role.Gardener); 
} 
+0

이것은 내가 본 내용을 설명하고 훌륭한 해결책입니다. 도와 주셔서 감사합니다! – Swoop

+0

Jason, WebForms'Response.Redirect'에 따라 스레드가 중단되는 대신 코드가 왜 계속되는지에 대해 의견을 말씀해 주실 수 있습니까? –

+0

@JasonTrue : 예, 스레드가 종료되지 않는 이유가 궁금합니다. –

18

ASP.NET MVC에서는 일반적으로 컨트롤러 메서드에서 RedirectResult을 반환하여 다른 페이지로 리디렉션합니다.

예 : ASP.Net MVC에 리디렉션

public ActionResult Details(int id) 
{ 
    // Attempt to get record from database 
    var details = dataContext.GetDetails(id); 

    // Does requested record exist? 
    if (details == null) 
    { 
     // Does not exist - display index so user can choose 
     return RedirectToAction("Index"); 
    } 

    // Display details as usual 
    return View(details); 
} 
+0

좋은 답변입니다. 도와 주셔서 감사합니다! – Swoop

-3

MVC에서

 if (Session["UserName"] == null) 
     { 
      this.Response.Redirect("LogOn"); 

     } 
+4

MVC 응용 프로그램에서 Response.Redirect를 호출하는 것이 좋습니다. 액션이나 필터에서 RedirectResult를 반환해야합니다. – RickAndMSFT

+0

@RickAnd - MSFT 왜 낙담하나요? 분명히 RedirectResult는 우수하지만 Response.Redirect가 낙심하는 이유는 무엇입니까? –

+0

좋은 질문입니다. 내 블로그 참조 Response.Redirect 및 ASP.NET MVC - 혼합하지 마십시오. http://blogs.msdn.com/b/rickandy/archive/2012/03/01/response-redirect-and-asp- net-mvc-do-not-mix.aspx – RickAndMSFT

7

가에 관해서는 Response.Redirect를 사용을

return RedirectToAction("ActionResultName", "ControllerName"); 

를 사용하지 않을 MVC보기 페이지 광맥이 코드를 시도 왜에 MVC에서 Response.Redirect 사용 :

  1. 성능 문제
  2. MVC 전용으로 빌드 된 표준 asp.net MVC 패턴 및 규칙을 따르지 않습니다.
1

권장 사항 및 유일한 방법은 asp로 리디렉션하는 것입니다.우리가 사용하여 리디렉션 할 수

return Redirect("/page/pagename.aspx"); 

다른 방법을 사용하여 MVC 컨트롤러 액션에 그물 형태 (권장 나쁜 방법이 아니다)

Response.Redirect("/page/pagename.aspx", true); 

그것이 리디렉션을 위해 작동하지만 문제는 모두 삭제됩니다입니다 우리의 세션 값. 그래서 왜 추천하지 않습니다.

관련 문제