MVC 3.0 学习笔记(强大的过滤器)

本文详细介绍了ASP.NET MVC中的授权筛选器、操作筛选器、结果筛选器和异常筛选器的功能、使用方法及运行顺序,同时展示了如何创建自定义操作筛选器并应用于Controller和Action中,以及如何在特定控制器中采用不同筛选器的方法。
摘要由CSDN通过智能技术生成
操作筛选器的某些可能用途包括:
  • 日志记录,目的是跟踪用户交互。

  • “反图像攫取”,用于防止在自己网站之外的网页中加载图像。

  • 爬网程序筛选,用于根据浏览器用户代理来更改应用程序行为。

  • 本地化,用于设定区域设置。

 

ASP.NET MVC 支持以下类型的操作筛选器:

  • 授权筛选器。 这些筛选器用于实现 IAuthorizationFilter 和做出关于是否执行操作方法(如执行身份验证或验证请求的属性)的安全决策。 AuthorizeAttribute 类和 RequireHttpsAttribute 类是授权筛选器的示例。 授权筛选器在任何其他筛选器之前运行。

  • 操作筛选器。 这些筛选器用于实现 IActionFilter 以及包装操作方法执行。 IActionFilter 接口声明两个方法:OnActionExecutingOnActionExecuted OnActionExecuting 在操作方法之前运行。 OnActionExecuted 在操作方法之后运行,可以执行其他处理,如向操作方法提供额外数据、检查返回值或取消执行操作方法。

  • 结果筛选器。 这些筛选器用于实现 IResultFilter 以及包装 ActionResult 对象的执行。 IResultFilter 声明两个方法:OnResultExecutingOnResultExecuted OnResultExecuting 在执行 ActionResult 对象之前运行。 OnResultExecuted 在结果之后运行,可以对结果执行其他处理,如修改 HTTP 响应。 OutputCacheAttribute 类是结果筛选器的一个示例。

  • 异常筛选器。 这些筛选器用于实现 IExceptionFilter,并在 ASP.NET MVC 管道执行期间引发了未处理的异常时执行。 异常筛选器可用于执行诸如日志记录或显示错误页之类的任务。 HandleErrorAttribute 类是异常筛选器的一个示例。

筛选器运行顺序

  

筛选器按下列顺序运行:

  1. 授权筛选器

  2. 操作筛选器

  3. 响应筛选器

  4. 异常筛选器

例如,授权筛选器最先运行,异常筛选器最后运行。 在每个筛选器类型中,Order 值将指定运行顺序。 在每个筛选器类型和顺序中,Scope 模拟值将指定筛选器的顺序。 此枚举将定义以下筛选器范围值(按它们运行的顺序):

  1. First

  2. Global

  3. Controller

  4. Action

  5. Last

例如,其 Order 属性设置为 0 且筛选器范围设置为 First 的操作筛选器将在其 Order 属性设置为 0 且筛选器范围设置为 Action 的操作筛选器之前运行。

未定义具有相同类型、顺序和范围的筛选器的执行顺序

 

 

实例:创建自定义操作筛选器

  

回顾一下ASP.NET MVC 操作筛选器的执行顺序,框架将先调用操作筛选器的 OnActionExecuting 方法,然后再调用以操作筛选器特性标记的任意操作方法。 同样,该框架将在操作方法完成后调用 OnActionExecuted 方法。

调用 OnResultExecuting 方法后,要立即调用您的操作返回的 ActionResult 实例。 执行结果后,紧接着就要调用 OnResultExecuted 方法。 这些方法对于执行日志记录、缓存输出结果之类的操作非常有用。

创建一个名为LoggingFilterAttribute的类

跟上面所说一样该类继承了ActionFilterAttribute表示操作特性的基类。

代码

    public class LoggingFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //可以自行添加一些控制代码
            filterContext.Controller.ViewData["mess1"] = "正要加载" + filterContext.ActionDescriptor.ActionName + "方法";

            base.OnActionExecuting(filterContext);
        }

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            //可以自行添加一些控制代码
            filterContext.Controller.ViewData["mess2"] = filterContext.ActionDescriptor.ActionName + "方法加载完毕";

            base.OnActionExecuted(filterContext);
        }
    }

此处我们只是设置了两个值,放在页面上做对照,完全可以换成日志功能。

调用操作筛选器

 

在Controller中新建Index方法在上面加上刚刚定义的筛选标志[LoggingFilter]

        //
        // GET: /Person/
        [LoggingFilter]
        public ActionResult Index()
         {
             ViewData["mess1"] = "mess1";
             ViewData["mess2"] = "mess2";
            return View(GetData());
        }

View代码

        <h2>@ViewData["mess1"]</h2>
        <h2>@ViewData["mess2"]</h2>

 

这一结果完全验证了,筛选器的工作顺序。OnActionExecuting-->Action-->OnActionExecuted

如果有多个筛选的话我们可以用Order来将他们一一列出顺序。默认Order为-1.

        //
        // GET: /Person/
        [LoggingFilter(Order = 1)]
        [LoggingFilter1(Order = 0)]
        public ActionResult Index()
         {
             ViewData["mess1"] = "mess1";
             ViewData["mess2"] = "mess2";
            return View(GetData());
        }

 

对指定的控制器采用不同的筛选

在ASP.NET MVC Controller 类中我们可以重写的 OnActionExecutingOnActionExecuted 方法。

这样重写这些方法中的一个或全部时,我们的逻辑将在该控制器的所有操作方法之前或之后执行。 此功能类似于操作筛选器,但方法局限于控制器范围。

此时我们就不需要单独去在Action上面去调用他了,因为该Controller 中的筛选已经被重写。并且仅属于该Controller

代码

        [NonAction]
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //可以自行添加一些控制代码
            filterContext.Controller.ViewData["mess1"] = "正要加载" + filterContext.ActionDescriptor.ActionName + "方法";
            base.OnActionExecuting(filterContext);
        }

        [NonAction]
        protected override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            //可以自行添加一些控制代码
            filterContext.Controller.ViewData["mess2"] = filterContext.ActionDescriptor.ActionName + "方法加载完毕";
            base.OnActionExecuted(filterContext);
        }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值