標籤: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過濾器淺析