文章出處

上一篇 看到了Action/Result過濾器的執行順序:

OnActionExecuting -> Action -> OnActionExecuted -> OnResultExecuting -> View-> OnResultExecuted

這一篇就來做幾個例子吧.

一、Demo

上一篇 的代碼可能并不怎么好懂. 首先, 我能在FilterConfig中注冊過濾器, 可以在Controller中重寫Action/Result過濾器或者是在Controller上標注過濾器特性, 還可以在方法上加上過濾器特性. 那么這些過濾器的執行, 都是在上一篇中的方法中執行的. 上一篇中, 并不能直觀的看到這些順序, 也是不好理解的點之一了.

但是上一篇提到過, 在調換順序之后, 最先執行的應該是Controller里面的過濾器, 那么到底是不是這樣呢?來看一下吧.

首先建幾個過濾器, 都繼承自 ActionFilterAttribute 類, 這里面有Action/Result的四個過濾器方法

//FilterConfig中注冊使用
public class MyFilterConfigAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.Write("FilterConfigAttribute - OnActionExecuted<br />");
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Write("FilterConfigAttribute - OnActionExecuting<br />");
    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.Write("FilterConfigAttribute - OnActionExecuted<br />");
    }

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Write("FilterConfigAttribute - OnActionExecuting<br />");
    }
}

//Controller上標注此特性
public class MyControllerAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.Write("ControllerAttribute - OnActionExecuted<br />");
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Write("ControllerAttribute - OnActionExecuting<br />");
    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.Write("ControllerAttribute - OnActionExecuted<br />");
    }

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Write("ControllerAttribute - OnActionExecuting<br />");
    }
}

//Action上標注此特性
public class MyActionAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.Write("ActionAttribute - OnActionExecuted<br />");
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Write("ActionAttribute - OnActionExecuting<br />");
    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.Write("ActionAttribute - OnActionExecuted<br />");
    }

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Write("ActionAttribute - OnActionExecuting<br />");
    }
}

然后就是在控制器和視圖.

[MyController]
public class FootController : Controller
{
    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.Write("FootController - OnActionExecuted<br />");
    }

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Write("FootController - OnActionExecuting<br />");
    }

    protected override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.Write("FootController - OnResultExecuted<br />");
    }

    protected override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Write("FootController - OnResultExecuting<br />");
    }

    [MyAction]
    public ActionResult Get()
    {
        Response.Write("<br /><br />Action 方法被執行<br /><br />");
        return View();
    }
}
@{
    ViewBag.Title = "Get";
}
<br />
<br />
Get - View視圖被解析
<br />
<br />

準備妥當了, 上結果:

從以上結果中可以看出, 最先執行的, 是Controller里面的ActionExecuting方法.

這里的執行順序, 有點類似遞歸的執行過程. 從這個結果來看上一篇的執行過程, 就很清晰了.

Controller內部Action/Result過濾器 - > FilterConfig注冊Action/Result過濾器 - > Controller標注Action/Result特性 - > Action標注Action/Result特性

目錄已同步


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()