前段时间从外包公司回来,回到公司加入到了公司项目中的开发。看到项目中用到了过滤器,以前没接触过,到网上查了一下,结合项目与自己的理解记录一下。
1、为什么要用到过滤器。2、它能解决什么问题 3、是否会带来新问题,严重不,我们是否能够解决掉?
在实际项目中,稍微像样点的项目总会有一些相关的AOP(面向切面,也叫做面向面)编程的组件,而MVC项目中太关心我们这些农民工啦,不想让MVC开发人员去为了身份验证、日志、异常等部分重复代码。于是我们在MVC项目中就可以直接使用它提供的Fileter特性帮我们解决,不用我们自己去实现复杂的AOP了。
以日志为例:
[LogActionFilter(Message="打开企业列表")]
public ActionResult Index() { return View(); }
[LogActionFilter(Message="添加企业")]
public ActionResult Add(Contact contact) { return View(); }public class LogActionFilter : ActionFilterAttribute {
public string Message { get; set; }
public override void OnResultExecuted(ResultExecutedContext filterContext) { //记录操作日志,写进操作日志中 var controllerName = filterContext.RouteData.Values["controller"]; var actionName = filterContext.RouteData.Values["action"]; }}
在合适的地方用到适当的Filter,ASP.NET MVC提供了几个默认的Filter
Filter Type | 实现接口 | 执行时间 | Default Implementation |
Authorization filter | IAuthorizationFilter | 在所有Filter和Action执行之前执行 | AuthorizeAttribute |
Action filter | IActionFilter | 分别在Action执行之前和之后执行。 | ActionFilterAttribute |
Result filter | IResultFilter | 分别在Action Result执行之后和之前 | ResultFilterAttribute |
Exception filter | IExceptionFilter | 只有在filter, 或者 action method, 或者 action result 抛出一个异常时候执行
| HandleErrorAttribute
|
因为ActionFilterAttribute默认实现了IActionFilter和IResultFilter。而ActionFilterAttribute是一个抽象类型,所以不能直接被实例化使用,所以我们想使用的话必须继承一下才能够使用。我们可以重载ActionFilterAttribute类中的以下几个方法:
OnActionExecuting – 在Action执行之前调用。
OnActionExecuted – 在Action执行之后调用。 OnResultExecuting – 在Result产生之前调用。 OnResultExecuted – 在Result产生之前调用。
根据需要,我们可以在重载的方法中写入需要的代码,如上面代码中,我只是在OnResultExecuted方法中写入了一些方法,用来记录操作日志。如果用过滤器进行验证的话,可以在OnActionExecuting方法里面进行一些验证。过滤器是在对请求进行处理时对动作逻辑进行扩展的手段,而不需要把这种逻辑包含在动作方法中。
在ASP.NET MVC中还有哪些场合会用到过滤器呢?
- 判断登录与否或用户权限
- 决策输出缓存
- 防盗链
- 防蜘蛛
- 本地化与国际化设置
- 实现动态Action
在园子里记录一下,方便以后用到后有个简单的回忆提示。
引用:http://www.cnblogs.com/boruipower/archive/2012/11/18/2775924.html