Как перенаправить из OnActionExecuting в базовый контроллер?

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

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

Если перенаправленный контроллер наследует от того же 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" } });
      }
   }
}