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


185

Я спробував два способи: Response.Redirect (), який нічого не робить, а також викликав новий метод всередині базового контролера, який повертає ActionResult і змушує його повернути RedirectToAction () ... жоден з цих дій не працює.

Як я можу зробити переспрямування з методу OnActionExecuting?

Відповіді:


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

79
Замість цього new RedirectResult(url)ви могли також використовувати new RedirectToAction(string action, string controller). Це можливо було додано до MVC після опублікування відповіді. Ваше рішення все одно поставило мене на правильний шлях.
Манфред

3
@Pluc - спочатку відбувається OnActionExecuting. Якщо встановити контекст.Результат, то перенаправлення відбувається перед виконанням дії. (Підтверджено особистим тестуванням / налагодженням.)
Джеймс

39
@Manfred Примітка, призначення має бути виконано методу (без new) RedirectToAction:filterContext.Result = RedirectToAction(string action, string controller);
cederlof

1
@Manfred Я просто хотів додати, що ви не створили б RedirectToAction. Це просто filterContext.Result = RedirectToAction (..)
Синестетика

4
Назва "RedirectToAction" не існує в поточному контексті ??
Ден Гастінгс

56

Це також можна зробити так:

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

35

Створіть окремий клас,

    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 конструктора, оскільки він відображає маршрутизацію в іншому місці MVC. +1
Пройшло кодування

3

Якщо перенаправлений контролер успадковує ту саму, baseControllerде ми перекриваємо OnActionExecutingметод, викликає рекурсивний цикл. Припустимо, ми переспрямовуємо його на дію входу контролера облікового запису, тоді дія входу буде викликати OnActionExecutingметод і перенаправлятись на ту саму дію входу знову і знову ... Тож ми повинні застосувати OnActionExecutingметод check, щоб перевірити погоду, якщо запит від того ж контролера, якщо тому тоді не перенаправляйте його знову на вхід. ось код:

захищені переохолодження.

void OnActionExecuting(ActionExecutingContext filterContext)
{
   try
   {
      some condition ...
   }
   catch
   {
      if (filterContext.Controller.GetType() !=     typeof(AccountController))
      {
         filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Account" }, { "action", "Login" } });
      }
   }
}

1
спробуйте {int CompanyId = UserContext.Company.CompanyId; } catch {if (filterContext.Controller.GetType ()! = typeof (AccountController)) {filterContext.Result = новий RedirectToRouteResult (новий RouteValueDictionary {{"контролер", "Обліковий запис"}, {"дія", "Вхід"}} ); }}
абдул хамед
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.