哪个重定向优先 - 控制器操作或ActionFilter的OnActionExecuted中的重定向?

时间:2009-05-05 15:38:34

标签: asp.net-mvc action-filter

看起来我又要做一些奇怪的事......

情况:

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 个答案:

答案 0 :(得分:1)

所以我刚刚进行了一项实验,证实了我的预期。

ExperimentEntryPoint返回一个ActionResult,即重定向到Action1。

OnActionExecuted会在框架的其余部分处理之前覆盖结果。说到它,它会看到重定向到Action2命令。

很好,很清楚。

答案 1 :(得分:1)

我想不出一个原因(是的! - 我可以想到你可能想在OnActionExecuting()中执行它的几个原因,在你的Action方法代码执行之前)使用filterContext.Result来改变ActionResult OnActionExecuting()方法,但绝对允许。

执行顺序是:

  • OnActionExecuting()
  • 您的Controller中的Action方法代码
  • OnActionExecuted()
  • OnResultExecuting()
  • 无论分配的ActionResult.ExecuteResult()返回什么(呈现视图,json,内容等)
  • OnResultExecuted()

正如您的实验所示,您可以在OnActionExecuted()和OnActionExecuting()中更改filterContext.Result。因为OnActionExecuted()在您的Controller代码之后被调用(例如:return RedirectToAction()),所以它设置为ActionResult优先。

我在Steven Sanderson的书“Pro ASP.NET MVC框架”中找到了对ActionFilters的不错报道。 [1] [2]

[1] http://books.google.com/books?id=Xb3a1xTSfZgC(Google图书预览中没有关于ActionFilters的内容)

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

答案 2 :(得分:0)

它们不能同时发生,因为它们都返回HTTP 302重定向。

该属性将执行重定向,因为它是在将结果发送到客户端之前发生的最后一件事。 OnActionExecuting和OnActionExecuted都将发生在控制器的操作结果之上。