ASP.NET MVC Framework支持四种不同类型的Filter:

  1. Authorization filters – 实现IAuthorizationFilter接口的属性.
  2. Action filters – 实现IActionFilter接口的属性.
  3. Result filters – 实现IResultFilter接口的属性.
  4. Exception filters – 实现IExceptionFilter接口的属性.

Filter的默认的执行顺序按上面的列表中顺序进行。如验证(authorization)Filter永远都是最开始执行的,异常(exception)Filter永远都是最后执行的,当然你也可以根据需要通过Order属性设定过滤器执行的顺序。

ASP.NET MVC Framework包括几种Action Filter:

名称 说明
OutputCacheAttribute  类似于 Web Form中在 OutputCache 指令。 OutputCache 属性允许在 MVC Framework 缓存控制器的输出。
ValidateInputAttribute 

类似于 Web Form中 ValidateRequest 属性。 MVC 框架默认将为 检查HTML 或其他危险输入传入的 HTTP 请求。 如果检测到,将引发异常。 使用此属性可以禁用请求验证。

AuthorizeAttribute Authorize 属性,可以对控制器操做的声明性的授权检查。 该属性可以限制特定角色中的用户的操作。 当您创建只应该给管理员角色中的用户的操作时,您可以使用此属性。默认使用的ASP.NET Membership服务,如果不使用ASP.NET 的Membership服务,可以继承AuthorizeAttribute,重写实现。
ValidateAntiForgeryTokenAttribute 此属性是一个解决方案以帮助防止跨站点的请求攻击 (CSRF)。 它允许验证的 HTTP POST 为特定于用户的标记在 Framework。 有关详细信息 CSRFs,请参阅" 使用 ASP.NET MVC AntiForgeryToken() 帮助器防止跨站点请求伪造 (CSFR)."

验证(authorization)filter用于实现在controller action上的验证和授权,如Authorize filter就是一个验证filter的例子;

Action filter包含一些逻辑,用于该action执行之前或者之后。比如可以使用一个action filter来修改action返回的view data;

Result filter包含一些逻辑,用于该action的view result执行之前和之后。比如可以修改一个view result在view被呈现到浏览器之前;

异常(Exception)Action用于处理异常信息,同样可以使用异常filter记录错误日志。

这些的filter类型是根据指定的顺序执行的,如果需要控制他们的执行顺序,需要设置filter的Order属性。

这些类的基类为System.Web.Mvc.FilterAttribute类,如果需要实现一个特定的filter类型,可以创建一个继承这个类的类,并且实现一个或多个IAuthorization、IActionFilter、IResultFilter、ExceptionFilter接口。

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属性值,将会抛出一个异常。

来看一个示例:

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

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

内置过滤器简介

1OutputCacheAttribute

[OutputCache(Duration=10,VaryByParam="none")]
public ActionResult TestCache() {
ViewBag.Time = DateTime.Now.ToString();
return View();
}

上述代码在动作方法上设置了OutputCache特性,使得页面具有缓存功能,缓存10秒。Cache的属性也可在web.config中设置

<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="outPutCache" duration="10" varyByParam="none"/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>

相应的动作方法上

[OutputCache(CacheProfile="outPutCache")]
public ActionResult TestCache() {
ViewBag.Time = DateTime.Now.ToString();
return View();
}

2 AuthorizeAttribute

该类主要实现页面的成员和角色管理,AuthorizeAttribute类中设置了两个属性,分别是Users和Roles,分别表示成员和角色

[Authorize]
public ActionResult TestAuthorize()
{
return View();
}

上述动作方法上设置了Authorize特性,指明该动作方法只能是注册并通过认证的用户才能访问

[Authorize(Users="test1,test2")]
public ActionResult TestAuthorize()
{
return View();
}

上述动作方法指明只有用户test1,test2能够访问,如果用户过多,可以将这些用户设置为一类角色,通过设置角色参数来设定

  [Authorize(Roles="Admin")]
public ActionResult TestAuthorize()
{
return View();
}

上述动作方法指明只有角色为Admin的用户才能访问。

3 HandleErrorAttribute

该类实现网站中指定控制器或者控制器中相关方法的异常处理。在动作方法上设置了[HandleError]特性后,发生异常时将自动交给异常处理页面,在MVC 4中,创建项目时,已经在Global.asax中添加了全局的HandleError特性

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}

ActionFilterAttribute基类

为了让用户更简单的创建一个自定义action filter,ASP.NET MVC Framework提供了一个基类ActionFilterAttribute,这个类实现了IActionFilter和IResultFilter接口,并且继承了Filter类。

这里的术语并不完全一致,从技术上说,这个类继承ActionFitlerAttribute,并且同时实现了action filter和result filter接口,但是从宽松意义上说,在ASP.NET MVC Framework中,任何实现filter的类型都是action filter。

ActionFilterAttribute类有以下的方法可以重写:

  • OnActionExecuting – 在controller action执行之前调用
  • OnActionExecuted – 在controller action执行之后调用
  • OnResultExecuting – 在controller action result执行之前调用
  • OnResultExecuted – 在controller action result执行之后调用

以下是这几个方法的执行顺序:

OnActionExecuting()-> Action execute & return View() ->OnActionExecuted() ->OnResultExecuting() -> Render View() ->OnResultExecuted()

为了阐述如何创建一个自定义的action filter,我们会创建一个自定义的action filter,用于记录controller action处理的不同阶段的日志信息,并显示到Visual Studio输出窗口中。

 public class LoginActionFilter : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Log("OnActionExecuted",filterContext.RouteData);
base.OnActionExecuted(filterContext);
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Log("OnActionExecuting", filterContext.RouteData);
base.OnActionExecuting(filterContext);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
Log("OnResultExecuted", filterContext.RouteData);
base.OnResultExecuted(filterContext);
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
Log("OnResultExecuting", filterContext.RouteData);
base.OnResultExecuting(filterContext);
}
private void Log(string methodName, RouteData routeData) {
var controllerName = routeData.Values["controller"];
var actionName = routeData.Values["action"];
var message = String.Format("{0} controller: {1} action: {2}", methodName, controllerName, actionName);
Debug.WriteLine(message,"Action Filter Log");
}
}

输出结果:

Action Filter Log: OnActionExecuting controller: Home action: Index
Action Filter Log: OnActionExecuted controller: Home action: Index
Action Filter Log: OnResultExecuting controller: Home action: Index
Action Filter Log: OnResultExecuted controller: Home action: Index

MVC Action Filter的更多相关文章

  1. ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)

    于ASP.NET MVC Preview5. 前一篇中我们已经了解了Action Filter 与 内置的Filter实现,现在我们就来写一个实例.就写一个防盗链的Filter吧. 首先继承自Filt ...

  2. [转]ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)

    前一篇中我们已经了解了Action Filter 与 内置的Filter实现,现在我们就来写一个实例.就写一个防盗链的Filter吧. 首先继承自FilterAttribute类同时实现IAction ...

  3. AspNet MVC : 操作/控制器过滤器(action filter)

    1.Action Filter Action Filter提供了在执行action/controller前后对请求/响应修改的能力,可以应用于action和控制器上,作用在控制器上将自动被应用到该控制 ...

  4. ASP.NET MVC的Action Filter

    一年前写了一篇短文ASP.NET MVC Action Filters,整理了Action Filter方面的资源,本篇文章详细的描述Action Filter.Action Filter作为一个可以 ...

  5. ASP.NET MVC 4.0的Action Filter

    有时候你想在调用action方法之前或者action方法之后处理一些逻辑,为了支持这个,ASP.NET MVC允许你自定义创建action过滤器.Action过滤器是自定义的Attributes,用来 ...

  6. 返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test

    原文:返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test [索引页] [源码下载] 返璞归真 ...

  7. Asp.net MVC使用Filter解除Session, Cookie等依赖

    本文,介绍了Filter在MVC请求的生命周期中的作用和角色,以及Filter的一些常用应用场景. 同时针对MVC中的对于Session,Cookie等的依赖,如何使用Filter解依赖. 如果大家有 ...

  8. [转]Asp.net MVC使用Filter解除Session, Cookie等依赖

    本文转自:http://www.cnblogs.com/JustRun1983/p/3279139.html 本文,介绍了Filter在MVC请求的生命周期中的作用和角色,以及Filter的一些常用应 ...

  9. ASP.NET MVC : Action过滤器(Filtering)

    http://www.cnblogs.com/QLeelulu/archive/2008/03/21/1117092.html ASP.NET MVC : Action过滤器(Filtering) 相 ...

随机推荐

  1. submit与button区别提交区别

    提交表单时使用submit会自动提交form表单数据, 如果使用jquery的form表单插件时需要将提交按钮改为button时$("#表单id").ajaxSubmit({}); ...

  2. C# 的轻量级 RPC 框架

    Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标:20000 tps. Concurrency level: 8 threads Comple ...

  3. 信息化的“五观”与“N为”

    系统观:联系的总体的看 生产力工具观:人与工具关系 马克思政治经济学 辨证观:发展的看 技术观:第一生产力  改变生产生活(生存)方式 信息论观:“人”联网 控制论 工程观:群体合作的智力游戏论

  4. PhoneGap 3.0 官方 安装 方法

    为使用最新版本PhoneGap ,决定使用官方提供的方法安装一次. 官方提供方法有些地方没有提到,因此这里记录完整的安装过程: 0.下载java sdk 1.6以上版本 1.下载Android Dev ...

  5. KafkaSpout分析:配置

    public KafkaSpout(SpoutConfig spoutConf) { _spoutConfig = spoutConf;} 基于0.93版本的Storm SpoutConfig继承自K ...

  6. Unity3D接入移动MM支付SDK(强联网)的问题

    原地址:http://blog.csdn.net/lihandsome/article/details/11919113 因为移动MM支付的SDK只提供android版本的,要自己写过一个androi ...

  7. Ubuntu环境下手动配置Java环境

    /×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...

  8. HDU1412

    大水题.. 求集合的并 /* */ #include<algorithm> #include<iostream> #include<string.h> #inclu ...

  9. hdu 4649 Professor Tian 反状态压缩+概率DP

    思路:反状态压缩——把数据转换成20位的01来进行运算 因为只有20位,而且&,|,^都不会进位,那么一位一位地看,每一位不是0就是1,这样求出每一位是1的概率,再乘以该位的十进制数,累加,就 ...

  10. ue标签不见了,如何解决?

    小问题,但是很恶心...如下图: 解决方法: 右键点击[菜单栏]右边的空白处,选择advanced,默认是basic,这时菜单栏中的菜单条目会变多,然后选择[视图]---[视图/列表]---[打开文件 ...