• 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 }

    效果

  • 相关阅读:
    【题解】洛谷P4391 [BOI2009] Radio Transmission(KMP)
    【题解】UVA10298 Power String(KMP)
    【题解】洛谷P4281 [AHOI2008] 紧急集合(求三个点LCA)
    [BZOJ4712]洪水-[树链剖分+线段树]
    [BZOJ2961]共点圆-[凸包+cdq分治]
    [BZOJ1185][HNOI2007]最小矩形覆盖-[凸包+旋转卡壳]
    [BZOJ2738]矩阵乘法-[整体二分+树状数组]
    [POJ2104]Kth Number-[整体二分]
    [arc082F]Sandglass
    [arc076F]Exhausted?
  • 原文地址:https://www.cnblogs.com/chenyanbin/p/11279739.html
Copyright © 2020-2023  润新知