MVC 3.0 使用过滤器(Filter)

ASP.NET MVC 筛选器的类型

 

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

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

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

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

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

 

ASP.NET MVC提供的筛选器

 

ASP.NET MVC 包括以下筛选器,这些筛选器将作为特性实现。筛选器可在操作方法、控制器或应用程序级别上应用。

AuthorizeAttribute.通过身份验证和授权(可选)限制访问。如:[Authorize]

HandleErrorAttribute.指定如何处理由操作方法引发的异常。默认状态此筛选器不会捕获异常,除非在 Web.config 文件中启用了 customErrors元素。

OutputCacheAttribute.提供输出缓存。

RequireHttpsAttribute.强制不安全的 HTTP 请求通过 HTTPS 重新发送。

 

筛选器运行顺序

   

筛选器按下列顺序运行:

  1. 授权筛选器

  2. 操作筛选器

  3. 响应筛选器

  4. 异常筛选器

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

  1. First

  2. Global

  3. Controller

  4. Action

  5. Last

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

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

  

取消筛选器的执行 

我们可以将 Result属性设置为非 null值,程序运行在 OnActionExecuting和 OnResultExecuting方法中会取消筛选器执行。任何挂起的 OnActionExecuted和 OnActionExecuting筛选器都不会调用,且调用程序不会为取消的筛选器和挂起的筛选器调用 OnActionExecuted方法。上次运行的筛选器的 OnActionExecuted筛选器将会运行。所有 OnResultExecuting和 OnResultExecuted筛选器都会运行。

  

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

   

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

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

创建一个名为LoggingFilterAttribute的类

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

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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]

1
2
3
4
5
6
7
8
9
//
        // GET: /Person/
        [LoggingFilter]
        public  ActionResult Index()
         {
             ViewData[ "mess1" ] =  "mess1" ;
             ViewData[ "mess2" ] =  "mess2" ;
            return  View(GetData());
        }

View代码

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

运行效果

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

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

1
2
3
4
5
6
7
8
9
10
//
         // GET: /Person/
         [LoggingFilter(Order =  1 )]
         [LoggingFilter1(Order =  0 )]
         public  ActionResult Index()
          {
              ViewData[ "mess1" ] =  "mess1" ;
              ViewData[ "mess2" ] =  "mess2" ;
             return  View(GetData());
         }

这样就会先执行LoggingFilter1后执行LoggingFilter。

 

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

 

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

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

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

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[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);
         }

运行效果与上面的一样

总结


有了筛选器我们的程序变的完美了,权限、操作、响应、异常这一系列的问题都完全被我们自己掌控,成为我们自己的规则,程序可控性更高。

本文转载至http://hi.baidu.com/ymnets/item/0fb4f03eebd6b0a6c3cf2945



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值