原文地址:http://www.asp.net/learn/mvc/tutorial-14-cs.aspx
这篇教程的目的是解释什么是行为过滤器(Action Filters )。行为过滤器是你可以应用到一个控制器行为的,或者整个控制器的,来修改控制器行为的执行方式的属性(attribute )。
理解行为过滤器
这篇教程的目的是解释什么是行为过滤器(Action Filters )。行为过滤器是你可以应用到一个控制器行为的,或者整个控制器的,来修改控制器行为的执行方式的属性(attribute )。ASP.NET MVC框架包含了几种行为过滤器:
- OutputCache -- 该行为过滤器缓存控制器行为的输出一段指定的时间
- HandleError -- 该行为过滤器处理控制器行为执行时产生的错误。
- Authoriz -- 该行为过滤器允许你限制一个特定的用户或角色接触指定的行为。
你也可以创建自定义的行为过滤器。例如,你可能想要创建自定义的行为过滤器来实现一个自定义的验证系统。或者,你可能想要创建一个修改由控制器行为返回的视图数据的行为过滤器。
在这篇教程,你会从底开始学习如何创建一个行为过滤器。我们创建了一个记录一个行为的不同处理阶段到Visual Studio 输出窗口的Log行为过滤器。
使用行为过滤器
一个行为过滤器是一个属性(attribute )。你可以将大部分的行为过滤器应用到单独的控制器行为或一整个控制器。
例如,清单1的Data控制器暴露了一个名叫Index(),返回当前时间的行为。该行为被OutputCache行为过滤器修饰。该过滤器会将该行为返回的值缓存10秒。
清单 1 - Controllers/DataController.cs
using System;
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
public class DataController : Controller
{
[OutputCache(Duration=10)]
public string Index()
{
return DateTime.Now.ToString("T");
}
}
}
如果你通过输入URL/Data/Index到地址栏然后几次单击刷新按钮来重复调用Index()行为,那么在10秒钟里你会看到同样的时间。Index()行为的输出被缓存了10秒(如图1)。
图 1 :缓存时间
在清单1里,一个单独的行为过滤器--OutputCache行为过滤器--被应用到Index()行为。如果你需要,你可以应用几个行为过滤器到同一个行为。例如,你可能想要应用OutputCache和HandleError行为过滤器到相同的行为过滤器。
在清单1,OutputCache行为过滤器被应用到Index()行为。你也可以将这个属性到DataController类。在这种情况下,该控制器暴露的任何行为返回的结果都将被缓存10秒。
不同的过滤器类型
ASP.NET MVC框架支持不同类型的过滤器:
- Authorization filters --实现了IAuthorizationFilter属性。
- Action filters -- 实现了IActionFilter属性。
- Result filters -- 实现了the IResultFilter属性。
- Exception filters --实现了IExceptionFilter属性。
过滤器以上面罗列的顺序被执行。例如,授权过滤器总是在行为过滤器前执行而异常过滤器总是在所有其它类型的过滤器执行后执行。
授权过滤器被用来实现对控制器行为的认证和授权。例如,Authorize过滤器就是一个授权过滤器的例子。
行为过滤器包含在控制器行为被执行前和在控制器行为被执行后的逻辑。举例来说,你可以使用一个行为过滤器,来修改一个控制器行为返回的视图数据。
结果过滤器包含在视图结果被执行前和视图结果被执行后的逻辑。例如,你可能想要在视图被浏览器渲染前修改视图结果。
异常过滤器是最后一种被执行的过滤器类型。你可以使用一种异常过滤器来处理由控制器行为或控制器行为结果产生的错误。
每一种不同类型的过滤器都按特定的顺序被执行。如果你想要控制同种类型的过滤器的执行顺序,那么你可以设置过滤的Order属性。
所有行为过滤器的基类是System.Web.Mvc.FilterAttribute类。如果你想要实现一个特定类型的过滤器,那么你需要创建一 个集成自基过滤器类和实现一个或多个IAuthorizationFilter、IActionFilter、IResultFilter或 ExceptionFilter接口。
ActionFilterAttribute基类
为了让你更容易地实现一个自定义的行为过滤器,ASP.NET MVC框架包含了一个基本的ActionFilterAttribute类。这个类实现了IActionFilter和IResultFilter两个接口并继承自Filter类。
这里的术语并不一致。从技术上来说,一个继承自ActionFilterAttribute类的过滤器既是一个行为过滤器也是一个结果过滤器。然而,从广泛的意义上来说,行为过滤器这个词被用以指代ASP.NET MVC框架里所有类型的过滤器。
ActionFilterAttribute基类有以下的方法供你重载:
- OnActionExecuting -- 这个方法在控制器行为被执行前调用。
- OnActionExecuted -- 这个方法在控制器行为被执行后调用。
- OnResultExecuting -- 这个方法在控制器行为结果被执行前调用。
- OnResultExecuted -- 这个方法在控制器行为结果被执行后调用。
在下一节,我们会看看怎样实现这几个不同的方法。
创建一个Log行为过滤器
为了向你描述如何创建一个自定义的行为过滤器,我们会创建一个自定义的记录处理一个控制器行为的过程到Visual Studio输出窗口的行为过滤器。我们的行为过滤器包含在清单2。
清单 2 - ActionFilters/LogActionFilter.cs
using System;
using System.Diagnostics;
using System.Web.Mvc;
using System.Web.Routing;
namespace MvcApplication1.ActionFilters
{
public class LogActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Log("OnActionExecuting", filterContext.RouteData);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Log("OnActionExecuted", filterContext.RouteData);
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
Log("OnResultExecuting", filterContext.RouteData);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
Log("OnResultExecuted", filterContext.RouteData);
}
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");
}
}
}
在清单2,OnActionExecuting()、OnActionExecuted()、 OnResultExecuting()和OnResultExecuted()方法都调用了Log()方法。方法的名称和当然路由数据被传递到 Log()方法。Log()方法将消息写到Visual Studio输出窗口里(如图2)。
图 2 :写到Visual Studio输出窗口
清单3的Home控制器描述了你如何应用Log行为过滤器到整个控制器类。无论何时由Home控制器暴露的行为被调用--Index()方法或About()方法--行为处理的阶段都会被记录到Visual Studio输出窗口。
清单 3 - Controllers/HomeController.cs
using System.Web.Mvc;
using MvcApplication1.ActionFilters;
namespace MvcApplication1.Controllers
{
[LogActionFilter]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult About()
{
return View();
}
}
}
总结
在这篇教程,我们向你介绍了ASP.NET MVC行为过滤器。你学习了不同类型的过滤器:授权过滤器、行为过滤器、结果过滤器和异常过滤器。你同时也学习了ActionFilterAttribute基类。
最后,你学习了如何实现一个简单的行为过滤器。我们创建了一个记录控制器行为处理阶段到Visual Studio输出窗口的Log行为过滤器。