ASP.Net MVC過濾器

陳彥斌發表於2019-07-31

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 }

效果

 

相關文章