기본 컨트롤러의 OnActionExecuting에서 리디렉션하는 방법은 무엇입니까?


185

나는 두 가지 방법을 시도했다 : Response.Redirect () 아무것도하지 않고 ActionController를 반환하고 RedirectToAction ()을 반환하는 기본 컨트롤러 내부의 새로운 메소드를 호출한다.

OnActionExecuting 메서드에서 리디렉션을 어떻게 수행합니까?

답변:


363
 public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
    ...
    if (needToRedirect)
    {
       ...
       filterContext.Result = new RedirectResult(url);
       return;
    }
    ...
 }

79
대신에을 new RedirectResult(url)사용할 수도 있습니다 new RedirectToAction(string action, string controller). 답변을 게시 한 후 MVC에 추가되었을 수 있습니다. 어쨌든 당신의 해결책은 나를 올바른 길로 안내했습니다.
Manfred

3
@Pluc-OnActionExecuting이 먼저 발생합니다. context.Result를 설정하면 조치가 실행되기 전에 경로 재 지정이 발생합니다. (개인 테스트 / 디버깅으로 확인)
James

39
@Manfred 참고, newRedirectToAction 메소드없이 할당을 수행해야합니다 :filterContext.Result = RedirectToAction(string action, string controller);
cederlof

1
@Manfred 나는 RedirectToAction을 새로 만들지 않을 것이라고 덧붙였다. 그냥 filterContext.Result = RedirectToAction (..)
Sinaesthetic

4
현재 컨텍스트에 'RedirectToAction'이라는 이름이 없습니다 ??
Dan Hastings

56

이 방법으로도 수행 할 수 있습니다.

filterContext.Result = new RedirectToRouteResult(
    new RouteValueDictionary
    {
        {"controller", "Home"},
        {"action", "Index"}
    }
);

35

별도의 수업을 만들고

    public class RedirectingAction : ActionFilterAttribute
    {
      public override void OnActionExecuting(ActionExecutingContext context)
      {
        base.OnActionExecuting(context);

        if (CheckUrCondition)
        {
            context.Result = new RedirectToRouteResult(new RouteValueDictionary(new
            {
                controller = "Home",
                action = "Index"
            }));
        }
      }
   }

그런 다음 컨트롤러를 만들 때이 주석을

[RedirectingAction]
public class TestController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

나는 MVC의 다른 곳에서 라우팅을 미러링 하기 때문에RouteValueDictionary 생성자 에이 익명 객체를 선호합니다 . +1
사라 코딩

3

리디렉션 된 컨트롤러가 동일한 baseController것을 상속 하면 OnActionExecuting메소드를 재정 의하여 재귀 루프를 발생시킵니다. 계정 컨트롤러의 로그인 작업으로 리디렉션한다고 가정하면 로그인 작업이 OnActionExecuting메소드 를 호출 하고 동일한 로그인 작업으로 반복해서 리디렉션됩니다 ... 따라서 OnActionExecuting동일한 컨트롤러의 요청이 날씨인지 확인하기 위해 체크인 방법을 적용해야 합니다 로그인 작업을 다시 리디렉션하지 마십시오. 코드는 다음과 같습니다.

보호 된 재정의.

void OnActionExecuting(ActionExecutingContext filterContext)
{
   try
   {
      some condition ...
   }
   catch
   {
      if (filterContext.Controller.GetType() !=     typeof(AccountController))
      {
         filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Account" }, { "action", "Login" } });
      }
   }
}

1
시도 {int CompanyId = UserContext.Company.CompanyId; } catch {if (filterContext.Controller.GetType ()! = typeof (AccountController)) {filterContext.Result = new RedirectToRouteResult (new RouteValueDictionary {{ "controller", "Account"}, { "action", "Login"}} ); }}
abdul은 (는)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.