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 }
效果
