asp.net MVC之Action過濾器淺析

來源:互聯網
上載者:User

標籤:ext   false   允許   原因   技術分享   ima   img   color   control   

在asp.net MVC中,Action過濾器是一大利器,它可以在以下兩個步驟執行相關的代碼:

1.執行Action方法之前:OnActionExecuting

2.Action方法執行完畢後:OnActionExecuted

一般我們自訂的Action過濾器會繼承FilterAttribute類和IActionFilter介面。

FilterAttribute類有兩個關鍵屬性:

AllowMultiple:布爾型,指示是否可指定篩選器特性的多個執行個體。如果可指定篩選器特性的多個執行個體,則為 true;否則為 false。

Order:int整型,擷取或者設定執行操作篩選器的順序。該屬性後面會講到。

 

IActionFilter介面有兩個關鍵方法:

void OnActionExecuting(ActionExecutingContext filterContext):在進入Action之前執行該方法。

void OnActionExecuted(ActionExecutedContext filterContext):Action方法執行完畢之後立刻執行該方法。

 

接下來讓我們用代碼親自實踐。

首先自訂一個Action過濾器:

    public class MyFirstActionFilterAttribute : FilterAttribute, IActionFilter {        public void OnActionExecuting(ActionExecutingContext filterContext) {            filterContext.HttpContext.Response.Write(string.Format("<h4 style=‘background-color:black;color:white;‘>{2} OnActionExecuting {0} {1}</h4>",                filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, filterContext.ActionDescriptor.ActionName, this.GetType().Name));        }        public void OnActionExecuted(ActionExecutedContext filterContext) {            filterContext.HttpContext.Response.Write(string.Format("<h4 style=‘background-color:black;color:white;‘>{2} OnActionExecuted {0} {1}</h4>",                filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, filterContext.ActionDescriptor.ActionName,GetType().Name));        }    }

接著我們將該方法過濾器附加到一個Action上:

        [MyFirstActionFilter]            public ActionResult ActionFilterTest() {            Response.Write("進入Action方法");            return  new EmptyResult();        }

執行結果如下:

執行的順序果然是 OnActionExecuting》Action》OnActionExecuted。

 

如果有很多Action過濾器附加到一個Action方法上,那麼執行的順序又是怎樣的呢?相當於自上而下壓棧式執行,可以將OnActionExecuting當做左大括弧,OnActionExecuted當做右大括弧。

我們繼續自訂兩個Action過濾器來實踐一下:

    public class MySecondActionFilterAttribute : FilterAttribute, IActionFilter {        public void OnActionExecuting(ActionExecutingContext filterContext) {            filterContext.HttpContext.Response.Write(string.Format("<h4 style=‘background-color:yellow;color:red;‘>{2} OnActionExecuting {0} {1}</h4>",                filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, filterContext.ActionDescriptor.ActionName, this.GetType().Name));        }        public void OnActionExecuted(ActionExecutedContext filterContext) {            filterContext.HttpContext.Response.Write(string.Format("<h4 style=‘background-color:yellow;color:red;‘>{2} OnActionExecuted {0} {1}</h4>",                filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, filterContext.ActionDescriptor.ActionName, GetType().Name));        }    }
public class MyThirdActionFilterAttribute : FilterAttribute, IActionFilter { public void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.HttpContext.Response.Write(string.Format("<h4 style=‘background-color:aliceblue;color:blue;‘>{2} OnActionExecuting {0} {1}</h4>", filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, filterContext.ActionDescriptor.ActionName, this.GetType().Name)); } public void OnActionExecuted(ActionExecutedContext filterContext) { filterContext.HttpContext.Response.Write(string.Format("<h4 style=‘background-color:aliceblue;color:blue;‘>{2} OnActionExecuted {0} {1}</h4>", filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, filterContext.ActionDescriptor.ActionName, GetType().Name)); } }

附加到同一個Action方法上:

        [MyFirstActionFilter]        [MySecondActionFilter]        [MyThirdActionFilter]        public ActionResult ActionFilterTest() {            Response.Write("進入Action方法");            return  new EmptyResult();        }

執行的結果如所示:

執行的順序果然是自上而下、壓棧式執行。這是預設的方式。

 

我們還可以通過設定每個Action過濾器的Order屬性來自訂它們的執行順序。這就是Action過濾器需要繼承FilterAttribute的原因。

接下來我們打亂每個Action過濾器的位置,並設定每個Action過濾器的Order屬性。如下代碼:

        [MyThirdActionFilter(Order = 3)]        [MySecondActionFilter(Order = 2)]        [MyFirstActionFilter(Order =1)]        public ActionResult ActionFilterTest() {            Response.Write("進入Action方法");            return  new EmptyResult();        }

運行程式,看一看執行的結果:

果然是根據Order的升序來執行的,且還是壓棧式執行。

 

介紹一個實際的用法。如果遇到跨域的情況,可以在OnActionExecuting方法中判斷目前使用者碼和相關標識,表示是否可以跨域處理。

類似如下代碼:

        public void OnActionExecuting(ActionExecutingContext filterContext) {            bool isAllowCrossDomain = false;            //判斷使用者碼和相關標識            //......            //判斷完畢並設定isAllowCrossDomain            //如果允許跨域            if (isAllowCrossDomain) {                //在此返回正確結果            }            else {                //返回錯誤碼和訊息說明            }            filterContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");        }

 

asp.net MVC之Action過濾器淺析

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.