답변:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
...
if (needToRedirect)
{
...
filterContext.Result = new RedirectResult(url);
return;
}
...
}
new
RedirectToAction 메소드없이 할당을 수행해야합니다 :filterContext.Result = RedirectToAction(string action, string controller);
별도의 수업을 만들고
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();
}
}
RouteValueDictionary
생성자 에이 익명 객체를 선호합니다 . +1
리디렉션 된 컨트롤러가 동일한 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" } });
}
}
}
new RedirectResult(url)
사용할 수도 있습니다new RedirectToAction(string action, string controller)
. 답변을 게시 한 후 MVC에 추가되었을 수 있습니다. 어쨌든 당신의 해결책은 나를 올바른 길로 안내했습니다.