Как перенаправить из OnActionExecuting в Base Controller?

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

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

4 ответа

Решение
 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" } });
      }
   }
}
Другие вопросы по тегам