1、微軟為ASP.Net MVC 提供4種過濾器
• Action過濾器(IAActionFilter):在Action執行之前和執行之後分別做一些操作
• View結果渲染過濾器(IResultFilter):在View結果渲染之前和View渲染之後分別做一些操作
• 全域性異常過濾器:ActionFilterAttribute:當整個網站出現異常,做過濾器中的程式碼
• 身份驗證過濾器
2、DEMO示例(Action和View)
第一步:在Models資料夾下建立一個類MyActionFilterAttribute.cs(注:Attribute結束)
第二步:繼承篩選器特性的基類:ActionFilterAttribute,並重寫基類下的4個方法
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 7 namespace MVCDemo2.Models 8 { 9 public class MyActionFilterAttribute:ActionFilterAttribute 10 { 11 public string Name { get; set; } 12 /// <summary> 13 /// 在Action執行之前先執行此方法 14 /// </summary> 15 /// <param name="filterContext">篩選器上下文。</param> 16 public override void OnActionExecuted(ActionExecutedContext filterContext) 17 { 18 base.OnActionExecuted(filterContext); 19 filterContext.HttpContext.Response.Write("OnActionExecuted---"+Name + "<br />"); 20 } 21 /// <summary> 22 /// 在Action執行之後執行此方法 23 /// </summary> 24 /// <param name="filterContext">篩選器上下文。</param> 25 public override void OnActionExecuting(ActionExecutingContext filterContext) 26 { 27 base.OnActionExecuting(filterContext); 28 filterContext.HttpContext.Response.Write("OnActionExecuting---" + Name+"<br />"); 29 } 30 /// <summary> 31 /// 在View渲染之前先執行此方法 32 /// </summary> 33 /// <param name="filterContext">篩選器上下文。</param> 34 public override void OnResultExecuted(ResultExecutedContext filterContext) 35 { 36 base.OnResultExecuted(filterContext); 37 filterContext.HttpContext.Response.Write("OnResultExecuted---" + Name + "<br />"); 38 } 39 /// <summary> 40 /// 在View渲染之後執行此方法 41 /// </summary> 42 /// <param name="filterContext">篩選器上下文。</param> 43 public override void OnResultExecuting(ResultExecutingContext filterContext) 44 { 45 base.OnResultExecuting(filterContext); 46 filterContext.HttpContext.Response.Write("OnResultExecuting---" + Name + "<br />"); 47 } 48 } 49 }
第三步:為控制器打上標籤
1 using MVCDemo2.Models; 2 using System.Web.Mvc; 3 4 namespace MVCDemo2.Controllers 5 { 6 public class HomeDemoController : Controller 7 { 8 // GET: HomeDemo 9 //Action過濾器 View結果渲染過濾器 全域性錯誤異常過濾器 --身份驗證過濾器 10 [MyActionFilter(Name ="HomeDemo/Index")] 11 public ActionResult Index() 12 { 13 Response.Write("<br /> Action執行啦!~<br />"); 14 return View(); 15 } 16 } 17 }
注:類上打標籤,下面所有方法都有效,若方法上打上標籤,以方法上的標籤為準!!!!!
第四步:效果
3、DEMO示例(全域性過濾器:MVC3.0以上)
• 在Global.asax中的Application_Start方法中,我們可以看到執行了全域性過濾器方法
•在App_Start資料夾下,找到FilterConfig.cs類,我們給他新增一個標籤
1 using MVCDemo2.Models; 2 using System.Web; 3 using System.Web.Mvc; 4 5 namespace MVCDemo2 6 { 7 public class FilterConfig 8 { 9 public static void RegisterGlobalFilters(GlobalFilterCollection filters) 10 { 11 filters.Add(new HandleErrorAttribute()); 12 filters.Add(new MyActionFilterAttribute() { Name="全域性的過濾器"}); 13 } 14 } 15 }
此時所有控制器都實現該標籤下的4個重寫方法,原理同上
4、補充:實現只要打上標籤的都要執行
此時我們只需要在自己建立的標籤類上,在打上標籤即可([AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)];第一個引數:列舉值,特性應用型別;第二個引數:獲取或設定一個布林值,該值指示指示的屬效能否由派生類和重寫成員繼承。;第三個引數:獲取或設定一個布林值,該值指示能否為一個程式元素指定多個指示屬性例項。)
回到我們建立的標籤類:MyActionFilterAttribute打上標籤
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 7 namespace MVCDemo2.Models 8 { 9 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] 10 public class MyActionFilterAttribute:ActionFilterAttribute 11 { 12 public string Name { get; set; } 13 /// <summary> 14 /// 在Action執行之前先執行此方法 15 /// </summary> 16 /// <param name="filterContext">篩選器上下文。</param> 17 public override void OnActionExecuted(ActionExecutedContext filterContext) 18 { 19 base.OnActionExecuted(filterContext); 20 filterContext.HttpContext.Response.Write("OnActionExecuted---"+Name + "<br />"); 21 } 22 /// <summary> 23 /// 在Action執行之後執行此方法 24 /// </summary> 25 /// <param name="filterContext">篩選器上下文。</param> 26 public override void OnActionExecuting(ActionExecutingContext filterContext) 27 { 28 base.OnActionExecuting(filterContext); 29 filterContext.HttpContext.Response.Write("OnActionExecuting---" + Name+"<br />"); 30 } 31 /// <summary> 32 /// 在View渲染之前先執行此方法 33 /// </summary> 34 /// <param name="filterContext">篩選器上下文。</param> 35 public override void OnResultExecuted(ResultExecutedContext filterContext) 36 { 37 base.OnResultExecuted(filterContext); 38 filterContext.HttpContext.Response.Write("OnResultExecuted---" + Name + "<br />"); 39 } 40 /// <summary> 41 /// 在View渲染之後執行此方法 42 /// </summary> 43 /// <param name="filterContext">篩選器上下文。</param> 44 public override void OnResultExecuting(ResultExecutingContext filterContext) 45 { 46 base.OnResultExecuting(filterContext); 47 filterContext.HttpContext.Response.Write("OnResultExecuting---" + Name + "<br />"); 48 } 49 } 50 }
效果