Как перенаправить из OnActionExecuting в Base Controller? - PullRequest
176 голосов
/ 09 июля 2010

Я попробовал два способа: Response.Redirect (), который ничего не делает, а также вызов нового метода внутри базового контроллера, который возвращает ActionResult и возвращает RedirectToAction () ... ни один из этих способов.

Как я могу сделать перенаправление из метода OnActionExecuting?

Ответы [ 4 ]

344 голосов
/ 09 июля 2010
 public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
    ...
    if (needToRedirect)
    {
       ...
       filterContext.Result = new RedirectResult(url);
       return;
    }
    ...
 }
52 голосов
/ 23 августа 2011

Это можно сделать и так:

filterContext.Result = new RedirectToRouteResult(
    new RouteValueDictionary
    {
        {"controller", "Home"},
        {"action", "Index"}
    }
);
35 голосов
/ 13 декабря 2011

Создать отдельный класс,

    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();
    }
}
3 голосов
/ 01 июля 2016

Если перенаправленный контроллер наследуется от того же baseController, где мы переопределяем метод OnActionExecuting, вызвать рекурсивный цикл.Предположим, что мы перенаправили его на действие входа в систему контроллера учетной записи, затем действие входа в систему будет вызывать метод OnActionExecuting и перенаправляться на одно и то же действие входа в систему снова и снова ... Поэтому мы должны применить метод check in 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" } });
      }
   }
}
...