24

我正在创建一个自定义ActionFilterAttribute,以便在 ajax 请求期间将ViewResults 和重定向转换为s 。我已经通过单元测试连接了大部分内容,出于某种原因,JsonResult我假设我的转换必须发生在返回一个结果。OnResultExecutingOnActionExecuted

我的问题是确切的时间OnResultExecutedOnResultExecuting被调用的时间,因为我在所有四个覆盖中都有断点,并且只有在OnActionExecuting和中的那些覆盖OnActionExecuted都在触发。

4

2 回答 2

16

让我们看下面的例子,它执行你描述的转换:

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方法。

于 2012-05-03T06:00:22.800 回答
12

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

  1. OnAction执行
  2. OnActionExecuted
  3. OnResultExecuting
  4. OnResultExecuted

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

于 2015-02-04T23:40:40.007 回答