나는 두 가지 방법을 시도했다 : 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" } });
}
}
}