Какой редирект имеет приоритет - тот, что в действии контроллера или в ActionFilter OnActionExecuted? - PullRequest
1 голос
/ 05 мая 2009

Похоже, я снова собираюсь сделать что-то странное ...

Ситуация:

public ExperimentAttribute
{
    public override void OnActionExecuted (ActionExecutingContext filterContext)
    {
        filterContext.Result =
                    new RedirectToRouteResult (
                        new RouteValueDictionary (new { Action = "Action2", Controller = "Experiment" }));
    }
}

public ExperimentController
{
    [Experiment]
    public ActionResult ExperimentEntryPoint ()
    {
        RedirectToAction ("Action1", "Experiment");
    }

    public ActionResult Action1 ()
    {
        /* ... */
    }

    public ActionResult Action2 ()
    {
        /* ... */
    }
}

Итак, какой редирект будет иметь место? Один в действии контроллера, один в ActionFilter или, может быть, оба?

Ответы [ 3 ]

1 голос
/ 05 мая 2009

Итак, я только что провел эксперимент, который подтвердил мои ожидания.

ExperimentEntryPoint возвращает ActionResult, а именно перенаправление на Action1.

OnActionExecuted перезаписывает результат до того, как остальная часть фреймворка его обработает. Когда дело доходит до этого, он видит перенаправление на команду Action2.

Красиво и ясно.

1 голос
/ 06 мая 2009

Я не могу придумать причину (ДА!! - я могу придумать несколько причин, по которым вы, возможно, захотите сделать это в OnActionExecuting () перед выполнением кода метода Action) для изменения ActionResult с помощью filterContext.Result в метод OnActionExecuting (), но он определенно разрешен.

Порядок исполнения:

  • OnActionExecuting ()
  • Ваш код метода действия в вашем контроллере
  • OnActionExecuted ()
  • OnResultExecuting ()
  • Независимо от того, что назначенное ActionResult.ExecuteResult () возвращает (отображает представление, json, содержимое и т. Д.)
  • OnResultExecuted ()

Как показал ваш эксперимент, вы можете изменить filterContext.Result как в OnActionExecuted (), так и в OnActionExecuting (). Так как OnActionExecuted () вызывается после кода вашего контроллера (пример: возврат RedirectToAction ()), все, что он устанавливает в качестве ActionResult, имеет приоритет.

Я нашел приличное освещение ActionFilters в книге Стивена Сандерсона «Pro ASP.NET MVC framework». [1] [2]

[1] http://books.google.com/books?id=Xb3a1xTSfZgC (содержимое в ActionFilters недоступно в Google Book Preview)

[2] http://blog.codeville.net/2009/04/29/now-published-pro-aspnet-mvc-framework-apress/

0 голосов
/ 05 мая 2009

Они не могут произойти, так как оба возвращают перенаправление HTTP 302.

Атрибут выполнит перенаправление, так как это происходит в последнюю очередь перед отправкой результата клиенту. И OnActionExecuting, и OnActionExecuted произойдут поверх результата действия контроллера.

...