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 }

效果

 

posted @ 2019-07-31 22:56  陈彦斌  阅读(228)  评论(0编辑  收藏  举报