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

bev*_*qua 21 asp.net asp.net-mvc asp.net-mvc-3

我正在创建一个自定义ActionFilterAttribute,以便在ajax请求期间将ViewResults和重定向转换为JsonResults.我通过单元测试将大部分内容连接起来,我出于某种原因假设我的转换必须发生OnResultExecuting,我意识到情况并非如此,并且正确的覆盖方法是OnActionExecuted,一旦操作方法被调用返回结果.

我的问题是,当正好是OnResultExecutedOnResultExecuting被调用,因为我已经在所有四个覆盖,只有在那些断点OnActionExecuting,并OnActionExecuted在所有射击.

Dar*_*rov 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)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

OnResultExecuting方法将在动作结果的ExecuteResult方法运行之前立即调用,紧接着之后的方法OnResultExecuted.


Dea*_*ers 9

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

  1. OnActionExecuting
  2. OnActionExecuted
  3. OnResultExecuting
  4. OnResultExecuted

查看清单2下的此链接.http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/understanding-action-filters-cs