我来说说MVC过滤器

APS.NET MVC中的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理。这时候就用到了过滤器。

在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能

  1. 判断登录与否或用户权限
  2. 决策输出缓存
  3. 防盗链
  4. 防蜘蛛
  5. 本地化与国际化设置
  6. 实现动态Action

MVC支持的过滤器类型有四种,分别是:Authorization(授权),Action(行为),Result(结果)和Exception(异常)。

如下表


过滤器类型


接口


描述


Authorization


IAuthorizationFilter


此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法


Exception


IExceptionFilter


用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常


Action


IActionFilter


用于进入行为之前或之后的处理


Result


IResultFilter


用于返回结果的之前或之后的处理

但是默认实现它们的过滤器只有三种,分别是Authorize(授权),ActionFilter,HandleError(错误处理);各种信息如下表所示


过滤器


类名


实现接口


描述


ActionFilter


AuthorizeAttribute


IAuthorizationFilter


此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法


HandleError


HandleErrorAttribute


IExceptionFilter


用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常


自定义


ActionFilterAttribute


IActionFilter和IResultFilter


用于进入行为之前或之后的处理或返回结果的之前或之后的处理

一、应用于Action的Filter

创建 Action filter 必须实现 IActionFilter 接口,该接口定义了两个方法

方法名 调用时机 可进行的操作
OnActionExecuting Action方法执行之前 可以给 filterContext.Result 赋值,以阻止 Action 的执行
可以通过 filterContext.ActionParameters 查看或修改 Action 的参数
OnActionExecuted Action方法执行之后 可以通过 filterContext.Exception 获取 Action 执行时抛出的异常,并能把它标记为“已处理”:filterContext.ExceptionHandled = true。
可以查看通过filterContext.Result查看 Action 的执行结果,但是不能修改。

Action过滤器是通过继承ActionFilterAttribute类来实现的一个Attribute类。ActionFilterAttribute 是一个抽象类,提供了两个virtual的方法给我们重写,OnActionExecutingOnActionExecuted

ASP.NET MVC 框架会在调用Action方法之前调用你Action过滤器中的OnActionExecuting方法,在之后调用Action过滤器中的OnActionExecuted方法。当然在创建Action过滤器的时候你不需两个方法都实现。

下面的示例是在调用Action方法之前和之后的日志跟踪:

C# 代码   复制


public class LoggingFilterAttribute : ActionFilterAttribute
 {
     public override void OnActionExecuting(FilterExecutingContext
        filterContext)
     {
         filterContext.HttpContext.Trace.Write("Starting: " +
         filterContext.ActionMethod.Name);
     }

    public override void OnActionExecuted(FilterExecutedContext
        filterContext)
     {
         if (filterContext.Exception != null)
         {
             filterContext.HttpContext.Trace.Write("Exception thrown");
         }
     }
 }

部分参数说明

Action Filter Context

OnActionExecuting方法有一个类型为FilterExecutingContext的参数,而OnActionExecuted方法有一个相应的类型为FilterExcutedContext的参数。两个Context类都是继承自FilterContext类,而FilterContext类继承自ControllerContext类并包含一个ActionMethod属性。你可以使用ActionMethod属性来坚定这个Action过滤器是应用到哪个Action方法上的。

FilterExecutingContext类包含一个 Cancel 的属性,允许你取消当前的Action。

FilterExcutedContext 类包含一个Exception属性和一个ExceptionHandled属性。如果Exception属性为null,则没有异常在action stack中,表明Action方法运行并没有发生错误。如果Exception属性不为null,则过滤器知道该怎么处理,过滤器处理完异常后会发出已经处理完的信号,然后将ExceptionHandled属性设为true。就算ExceptionHandled属性为true,堆栈中添加到其他Action方法的OnActionExcetued方法将会照常被调用,这种场景就如就算一个异常被处理了,日志记录filter一样照常执行。

使用方法

你可以将过滤器应用到任何一个你喜欢的Action方法上。下面的示例演示一个控制器中包含的用Action过滤器Attribute标记的Action方法。

C# 代码   复制


public class HomeController : Controller
 {
     [LoggingFilter]
     public void Index()
     {
         RenderView("Index");
     }

    [LoggingFilter]
     public void About()
     {
         RenderView("About");
     }

    [LoggingFilter]
     public void ClickMe()
     {
         HttpContext.Trace.Write("Button was clicked.");
         InvokeAction("Index");
     }
 }

Action过滤器的作用范围

除了用Action过滤器标记一个Action方法外,你也可以用来标记一个完成的控制器类。如果这样的话,这个Action过滤器将会应用到该控制器的所有Action方法上。

另外,如果你的控制器类继承自别的控制器类,而基控制器类可能有它自己的Action过滤器Attributes。如果你在子类中重写了基控制器类的Action方法,则子类的该Action方法也会有它自己的从基类继承而来的Action过滤器Attributes。

Action过滤器的执行顺序

每一个Action过滤器都有一个 Order 属性,用来决定Action过滤器在该范围内的执行顺序。Order属性必需是0(默认值)或者更大的整数值。省略Order属性则会给该过滤器的Order值为 -1, 表明为指明顺序。任何一个在同一范围的Action过滤器Order设为 -1 的都将按不确定的顺序执行,单在此之前过滤器有一个特定的顺序(注:下面会说到).

当设置Order属性的值的时候,必需指定一个唯一的值。如果两个或者更多的Action过滤器具有相同的Order属性值,将会抛出一个异常。

示例:

C# 代码   复制


 [Filter1(Order = 2)]
 [Filter2(Order = 3)]
 [Filter3(Order = 1)]
 public void Index()
 {
     RenderView("Index");
 }

Filter的执行顺序为:Filter3 => Filter1 => Filter2.

二、Controller的Filter

ASP.NET MVC 控制器(Controller)类定义的OnActionExecuting 和 OnActionExcuted 方法你可以重写。当你重写一个或者这两个方法的时候,你实际上定义了一个将会应用到该控制器类中所有的Action方法的Action过滤器。严格来说,这个方法没有构成一个Action过滤器,但不管怎样,她们提供的功能是相似的。

将Filter应用在Controller上有2种方式

1.直接将Filter应用在Controller上,如:

[TestFilter]
    public class EiceController : Controller
    {
     }

2.重写Controller内的

OnActionExecuting/OnActionExecuted/OnResultExecuting/OnResultExecuted的四个方法。

在下面的示例中,控制器级别的OnActionExecuting和OnActionExecuted方法应用到控制器中所有的Action方法中:

C# 代码   复制


public class HomeController : Controller
 {
     public void Index()
     {
         RenderView("Index");
     }

    public void About()
     {
         RenderView("About");
     }

    public void ClickMe()
     {
         HttpContext.Trace.Write("Button was clicked.");
         InvokeAction("Index");
     }

    protected override void OnActionExecuting(FilterExecutingContext
        filterContext)
     {
         filterContext.HttpContext.Trace.Write("Starting: " +
             filterContext.ActionMethod.Name);
     }

    protected override void OnActionExecuted(FilterExecutedContext
        filterContext)
     {
         if (filterContext.Exception != null)
         {
             filterContext.HttpContext.Trace.Write("Exception thrown");
         }
     }
 }

三、几个系统常用的Filter过滤器

1、AcceptVerbs

规定页面的访问形式,如

        [AcceptVerbs(HttpVerbs.Post)]
         public ActionResult Example(){
             return View();
         }

页面只能以Post形式访问,即表单提交。

2、ActionName

规定Action的名称。

应用场景:如果不想用方法名做为Action名,或Action名为关键字的话,如

       [ActionName("class")]
         public ActionResult Example(){
             return View();
         }

3、NonAction

当前方法仅是普通方法不解析为Action

4、OutputCache

为Action添加缓存

        [OutputCache(Duration = 60, VaryByParam = "*")]
        public ActionResult Example()
        {
            return View();
        }

5、ValidateInput

该Action可以接受Html等危险代码(ASP.NET MVC在aspx中设置<%@ Page 的属性无法完成等同任务。)

        [ValidateInput(false)]
        public ActionResult Example()
        {
            return View();
        }

6、ValidateAntiForgeryTokenAttribute

用于验证服务器篡改。

        [ValidateAntiForgeryToken]
        public ActionResult Example()
        {
            return View();
        }
时间: 2024-07-28 13:24:34

我来说说MVC过滤器的相关文章

ASP.NET MVC过滤器(一)

MVC过滤器是加在 Controller 或 Action 上的一种 Attribute,通过过滤器,MVC 网站在处理用户请求时,可以处理一些附加的操作,如:用户权限验证.系统日志.异常处理.缓存等.MVC 中包含Authorization filter.Action filter.Result filter.Exception filter 四种过滤器. APS.NET MVC中的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理.这

MVC过滤器详解和示例

原文  http://blog.csdn.net/ankeyuan/article/details/29624005 MVC过滤器一共分为四个:ActionFilter(方法过滤器),ResultFilter(结果过滤器,感觉不是很好听,就这样叫吧),AuthorizationFilter(授权过滤器),ExceptionFilter(异常处理过滤器) 过滤器类型 接口 默认实现 描述 Action IActionFilter ActionFilterAttribute 在动作方法之前及之后运行

ASP.NET MVC 过滤器说明

ASP.NET MVC 过滤器分别如下: 过滤器执行顺序:  

MVC过滤器基本使用

Action过滤器 /// <summary> /// 执行代码前执行 /// </summary> /// <param name="filterContext"></param> public override void OnActionExecuting(ActionExecutingContext filterContext) { //1.显示触发过滤器action方法的名称 string actionName = filterC

ASP.NET MVC 过滤器(三)

ASP.NET MVC 过滤器(三) 前言 本篇讲解行为过滤器的执行过程,过滤器实现.使用方式有AOP的意思,可以通过学习了解过滤器在框架中的执行过程从而获得一些AOP方面的知识(在顺序执行的过程中,这种编程模式就是横向的插入点),言归正传,我们还是以学习过滤器为主.对于IAuthorizationFilter授权认证过滤器的使用篇幅,我知道怎么用但是写不出来,里面包含知识点很多,功底尚浅写了一半又给删掉了,宁愿不发也不能坑人,在后面的学习中假使我可以掌握了,一定会及时的写出来跟大家分享.这个目

ASP.NET MVC 过滤器(一)

ASP.NET MVC 过滤器(一) 前言 前面的篇幅中,了解到了控制器的生成的过程以及在生成的过程中的各种注入点,按照常理来说篇幅应该到了讲解控制器内部的执行过程以及模型绑定.验证这些知识了.但是呢,在MVC框架中提供了一种机制在控制器方法执行之前我们还可以通过这种机制来做一些横向切面的操作,这种机制的实现就是过滤器了,在本篇和后续的篇幅中将会对几种过滤器做一番讲解,并且会对过滤器在框架中的一个执行过程进行粗略的讲解. ASP.NET MVC过滤器 过滤器在系统框架中的整体对象模型 IAuth

ASP.NET MVC 过滤器(四)

ASP.NET MVC 过滤器(四) 前言 前一篇对IActionFilter方法执行过滤器在框架中的执行过程做了大概的描述,本篇将会对IActionFilter类型的过滤器使用来做一些介绍. ASP.NET MVC过滤器 过滤器在系统框架中的整体对象模型 IAuthorizationFilter授权认证过滤器的执行过程 使用IAuthorizationFilter过滤器 IActionFilter行为过滤器的执行过程 自定义实现IActionFilter行为过滤器 异常过滤器的使用 自定义实现

MVC过滤器进行统一登录验证

统一登录验证: 1.定义实体类Person:利用特性标签验证输入合法性设计登录页面 1 2 3 4 5 6 7 8 9 public class Person {     [DisplayName("用户名"), Required(ErrorMessage = "账户非空!")]     public string LoginName { get; set; }     [DisplayName("密 码"), Required(ErrorMes

ASP.NET MVC 过滤器开发与使用

文章来源:http://www.cnblogs.com/JinvidLiang/p/4660200.html(感谢) ASP.NET MVC 过滤器开发与使用 ASP.NET MVC 中给我们提供了内置的过滤器,通过过滤器,我们可以在控制器内的方法前后,添加必须的业务逻辑,如权限验证,身份验证,错误处理等. 今天,我们主要介绍3个过滤器:OutputCacheAttribute,AuthorizeAttribute,HandleErrorAttribute. 我们会根据这三个内置过滤器,分别举不

MVC过滤器 OnActionExecuting() 在过滤器中获取触发控制器,Action 等

<1> using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVC过滤器.Filters { //自定义一个过滤器 [MyActionFilter] public class MyActionFilterAttribute:ActionFilterAttribute { //重写OnActionExecuting方