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