ASP.Net MVC过滤器

Posted chenyanbin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.Net MVC过滤器相关的知识,希望对你有一定的参考价值。

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 

效果

技术图片

 

以上是关于ASP.Net MVC过滤器的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 25. 过滤器

ASP.NET MVC学习之过滤器篇

ASP.NET MVC

如何使用 mvc 6、asp.net 5 注册全局过滤器

ASP.Net MVC过滤器

Asp.Net MVC过滤器