2010-01-13 2 views
21

Asp.Net Futures RenderAction 메서드로 렌더링하는 일부 부분 동작이 있습니다. 리디렉션 중 일부는 리디렉션이 처리 된 후 리디렉션을 수행합니다.Asp.net MVC 2의 하위 작업에서 리디렉션 결과가 허용되지 않는 이유

내가 Asp.Net MVC 2 RC로 업그레이드 했으므로 "자식 작업은 리디렉션 작업을 수행 할 수 없습니다"라는 오류 메시지가 표시됩니다.

소스 코드를 체크 아웃하고 예외를 throw하는 줄을 발견했습니다. 이를 해결하기 위해 커스텀 리다이렉트 리서치 (RedirectResult)를 만들 수 있습니다. 그러나 그 전에 프레임 워크가 왜 그것을 허용하지 않는지 이해하고 싶습니다. 좋은 이유가 있어야하고 어쩌면해야하지 않을 것입니다.

누구나이 제한의 이유를 알고 있습니까? MVC는 이미 클라이언트에 뷰를 렌더링하기 시작했기 때문에

감사

답변

32

는 한계가 존재한다. 이 지점에서 리디렉션되는 효과는 정의되지 않습니다. 완벽하게 작동 할 수 있고, 리디렉션하지 않고도 원래의 뷰를 렌더링 할 수 있고, 다른 예외를 throw 할 수 있습니다.

이 작업을 수행 한 결과는 정의되지 않았으므로 프레임 워크가이를 차단합니다. 실제로 RenderAction은 유사한 이유로 뷰 (또는 뷰와 유사한 내용) 이외의 것을 렌더링하는 데 사용해서는 안됩니다.

특별한 경우 외부 작업이 리디렉션되어야합니다. 어쨌든 사용자에게 아무 것도 보여주지 않고서도보기 내에서 리디렉션을 끝내려는 경우, 바깥 행동이 해당 작업을 적절하게 위임 할 수 있으므로 처음부터보기를 수행 할 목적이 없습니다. 개인적인.

1

그런 경우 부분보기 양식의 제출 URL을 문제가있는 리디렉션의 대상인 작업으로 지정하고 GET 버전으로 리디렉션하도록하십시오.

6

제 경우, 렌더링되는 양식은 내가 만들고있는 웹 사이트의 확장에 대한 "구성"패널입니다. 확장 프로그램의 자체 컨트롤러가 양식 처리를 처리하고 구성된 모든 확장을 나열하는 관리자 페이지로 다시 리디렉션 할 수 있기를 바랍니다. 부모 페이지의 컨트롤러에 확장 기능의 양식을 처리하도록 요청하는 것이 적절하거나 실용적이지 않다고 생각합니다. 내가 대신 제안하는 바는 무엇입니까?

+0

:

이 문제를 해결하려면, 나는 모든 하위 작업에 리디렉션을 권한 부여 체크를 제거했습니다. 확장 성을 위해 관리자 페이지에서만 사용하기 때문에 하위 작업 컨트롤러에서 리디렉션을 유지하기로 결정했습니다. 내 자신의 ChildActionRedirectResult를 쓴 다음 ChildActionController 기반을 만들어 리디렉션 메서드를 재정의하여 내 자신의 결과를 사용했습니다. 나는 프런트 엔드 사용을 위해 이것을하지 않을 것이다. – Sruly

+0

"변경 사항이 저장되었습니다"라는 메시지와 확장 기능 관리를위한 관리자 페이지로 다시 연결되는 간단한보기 결과 만 반환되었습니다. 그것은 꽤 아니지만 트릭을 했어. –

3

가끔이 오류는 기본 동작 결과의 동작을 렌더링하려고 할 때 발생합니다. 예 :

ActionResult X 
    Return View 
View X 
    RenderAction Y 

ActionResult Y 
    // Bla bla 
     return View 
    // else 
     return RedirectToAction X 
12

내 솔루션.

의 조치 방법 : 아이의 행동이 같은 것을 사용하는

<script type="text/javascript" language="javascript"> 
    document.location = '<%: Url.Action("Index", "Album", new { id = Model.Id }) %>';</script> 
17

시도 : 나의 특별한 경우

ControllerContext.HttpContext.Response.Redirect(ControllerContext.HttpContext.Request.Url.ToString()); 
+1

성공적인 로그인시 리디렉션해야하는 기본 페이지의 부분보기로 표시된 로그인 동작에이 URL을 사용했습니다. – user1760527

+0

이것은 실제로 클라이언트 브라우저가 리디렉션 헤더를받은 후 페이지를 다시 요청하게하지만 충분히 잘 작동합니다. –

5

을, 나는 사용자 정의 AuthorizeAttribute했다보기

return View("Redirect", model); 

자식 동작에 리디렉션하려고 시도했던 내 컨트롤러에 연결되어 있습니다 (위에서 언급 한 것처럼). 결혼했다.나는이 같은 시나리오의

Public Overrides Sub OnAuthorization(filterContext As AuthorizationContext) 
    //Child actions cannot redirect anyway, so no need to check permissions. 
    If filterContext.IsChildAction Then Exit Sub 

    .. parent authorisation checks .. 
관련 문제