我正在创建自定义ActionFilterAttribute
,以便在ajax请求期间转换ViewResult
并重定向到JsonResult
。我通过单元测试连接了大部分内容,我出于某种原因假设我的转换必须在OnResultExecuting
进行,我意识到情况并非如此,并且正确的覆盖方法是OnActionExecuted
,只要action方法返回结果就会调用它。
我的问题是,当OnResultExecuted
和OnResultExecuting
被调用时,因为我在所有四个覆盖中都有断点,只有OnActionExecuting
和OnActionExecuted
中的断点才会被触发所有
答案 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)
在寻找一段时间并试图理解接受的答案后,我发现了这一点。我相信这表明执行的顺序是