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

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

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



답변

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


답변

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

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


답변

별도의 수업을 만들고

    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();
    }
}


답변

리디렉션 된 컨트롤러가 동일한 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" } });
      }
   }
}


답변