Як перенаправити з 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.