什么时候OnResultExecuted和OnResultExecuting完全开火?

时间:2012-05-03 01:32:33

标签: asp.net asp.net-mvc asp.net-mvc-3

我正在创建自定义ActionFilterAttribute,以便在ajax请求期间转换ViewResult并重定向到JsonResult。我通过单元测试连接了大部分内容,我出于某种原因假设我的转换必须在OnResultExecuting进行,我意识到情况并非如此,并且正确的覆盖方法是OnActionExecuted ,只要action方法返回结果就会调用它。

我的问题是,当OnResultExecutedOnResultExecuting被调用时,因为我在所有四个覆盖中都有断点,只有OnActionExecutingOnActionExecuted中的断点才会被触发所有

2 个答案:

答案 0 :(得分:15)

让我们采用以下示例执行您描述的转换:

public class MyActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            var result = filterContext.Result as ViewResultBase;
            if (result != null && result.Model != null)
            {
                filterContext.Result = new JsonResult
                {
                    Data = result.Model,
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
            }
        }
    }

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
    }
}

OnResultExecuting方法将在操作结果的ExecuteResult方法运行之前立即调用,而OnResultExecuted方法将立即调用。

答案 1 :(得分:8)

在寻找一段时间并试图理解接受的答案后,我发现了这一点。我相信这表明执行的顺序是

  1. OnActionExecuting
  2. OnActionExecuted
  3. OnResultExecuting
  4. OnResultExecuted
  5. 点击清单2 http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/understanding-action-filters-cs

    下的此链接