ASP.NET MVC学习笔记-----Filter(2)

接上篇ASP.NET MVC学习笔记-----Filter(1)


Action Filter
Action Filter可以基于任何目的使用,它需要实现IActionFilter接口:
public interface IActionFilter
{
void OnActionExecuting(ActionExecutingContext filterContext);
void OnActionExecuted(ActionExecutedContext filterContext);
}
顾名思义,OnActionExecuting方法将在Action方法执行前调用,而OnActionExecuted方法将在Action方法执行后调用。
 
我们可以看到,OnActionExecuting方法的参数filterContext的类型为ActionExecutingContext,它同样继承于ControllerContext,并额外提供了Result属性和ActionDesciptor属性,它们的作用在上篇已经介绍过。
 
同样,OnActionExecuted方法的参数filterContext的类型为ActionExecutedContext,继承于ControllerContext,额外提供了Result属性,ActionDescriptor属性和Exception属性(Action方法抛出的未处理异常).
 
多说无益,来看一个例子吧:

     public class CustomerActionAttribute : FilterAttribute, IActionFilter
{
private Stopwatch timer; public void OnActionExecuting( ActionExecutingContext filterContext)
{
timer = Stopwatch .StartNew();
}
public void OnActionExecuted( ActionExecutedContext filterContext)
{
timer.Stop(); if (filterContext.Exception == null )
{
filterContext.HttpContext.Response.Write(
string .Format("<div>Action执行时间:{0}</div>" , timer.Elapsed.TotalSeconds));
}
}
}
     public class HomeController : Controller
{
[CustomerAction]
public ViewResult Index()
{
return View();
} }

执行结果:

Result Filter
Result Filter跟Action Filter有些类似,但它是在ActionResult执行前后执行,Result Filter需要实现IResultFilter接口:
public interface IResultFilter
{
void OnResultExecuting(ResultExecutingContext filterContext);
void OnResultExecuted(ResultExecutedContext filterContext);
}
 
ActionFilterAttribute
ASP.NET MVC提供了ActionFilterAttribute,它是一个抽象类,继承FilterAttribute,实现IActionFilter和IResultFilter接口:
public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter
{
public virtual void OnActionExecuting(ActionExecutingContext filterContext)
{
} public virtual void OnActionExecuted(ActionExecutedContext filterContext)
{
} public virtual void OnResultExecuting(ResultExecutingContext filterContext)
{
} public virtual void OnResultExecuted(ActionExecutingContext filterContext)
{
}
}
感觉这个类,就是给我们提供方便的,让我们能根据需要重写相应的方法。
 
Global Filter 
如果我们需要将一个Filter作用于所有的Controller和Action的话,我们可以在FilterConfig.cs中的RegisterGlobalFilters方法注册全局Filter:
   public class FilterConfig
{
public static void RegisterGlobalFilters( GlobalFilterCollection filters)
{
filters.Add( new HandleErrorAttribute ());
filters.Add( new CustomerActionAttribute ());
}
}
Filter 的执行顺序
总的来说(相同类型的Filter),Global Filter最先执行,随后执行的是作用于Controller的Filter,最后执行的是作用于Action的Filter。但是Exception Filter的执行顺序却是完全相反的。
如果是针对同一个Action或Controller的多个Filter(filer的类型相同),它们的执行顺序是未定的。但是我们可以通过指定Order属性来定义执行顺序。
 
 

ASP.NET MVC学习笔记-----Filter2的更多相关文章

  1. ASP.NET MVC学习笔记-----Filter

    ASP.NET MVC学习笔记-----Filter(1) Filter类型 接口 MVC的默认实现 Description Authorization IAuthorizationFilter Au ...

  2. ASP.NET MVC学习笔记-----Filter(2)

    接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用,它需要实现IActionFilter接口: public ...

  3. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  4. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  5. ASP.NET MVC 学习笔记(1)

    从头开始系统地学习ASP.NET MVC 为什么要学习ASP.NET MVC?原因很多,可以先来看一下最早的ASP.NET WebForm的一些缺点: 传说中面试经常要问到的ASP.NET WebFo ...

  6. 【转】ASP.NET MVC学习笔记-Controller的ActionResult

    1. 返回ViewResult public ActionResult Index()   {       ViewData["Message"] = "Welcome ...

  7. ASP.NET MVC学习笔记-----使用自定义的View Engine

    我们都知道在ASP.NET MVC中自带了Razor View Engine,Razor十分的强大,可以满足我们绝大部分的需要.但是ASP.NET MVC的高度可扩展性,使我们可以使用自定义的View ...

  8. ASP.NET MVC学习笔记-----ActionInvoker

    还是这张图: 当ControllerFactory生成Controller实例后,这时就需要使用ActionInvoker来选择调用一个合适的Action执行.ASP.NET MVC提供的基类Cont ...

  9. ASP.NET MVC 学习笔记 1

    1. 什么是ASP.Net MVC ASP.Net MVC是一种开发Web应用程序的工具(is a web application development framework),采用Model-Vie ...

随机推荐

  1. iOS程序 # 启动过程

    [ App 应用 ] 中文名:缺省 外文名:default 拼音:quē shěng 释义:系统默认状态 全称:缺省状态 -------------- 1.程序启动顺序 1> main.m程序入 ...

  2. Hack 语言学习/参考---1.2 Hack Background

    Hack Background Facebook was initially built with PHP. Parameters and return types were specified in ...

  3. mysql分表分库

    单库单表 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 单库多表 随着用户数量的增加,user表的数据量会越来越大,当数 ...

  4. [Openstack] Expecting an auth URL via either --os-auth-url or env[OS_AUTH_URL]

    直接使用devstack在ubuntu14.04单个节点的建筑openstack 使用keystone查询租户和用户始终报告时,这个错误! 主要看下这些配置是否正确.我们将能够解决这个问题 opens ...

  5. [Unity3D]Unity3D游戏开发之刀光剑影特效的实现

    大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 我实在不明确有的人为什么不喜欢武侠/仙侠类游戏,也许是因为武侠/仙侠类游戏身上被永远烙上的国 ...

  6. AutoMapper 创建嵌套对象映射(原创)

    之前在做DTO转换时,用到AutoMapper.但DTO的层次太深了,无奈官方没针对嵌套类型提供好的解决方案,于是自己实现了一下: 思路:采用递归和反射很好的避免手工创建嵌套对象的映射. 第一个版本, ...

  7. Windows环境搭建Web自动化测试框架Watir

    Windows环境搭建Web自动化测试框架Watir 一.前言     Web自动化测试一直是一个比较迫切的问题,对于现在web开发的敏捷开发,却没有相对应的敏捷测试,故开此主题,一边研究,一边将We ...

  8. css-缩写

    border缩写 /*缩写前*/ element{ border-top-width:1px; border-top-style:solid; border-top-color:#cccccc; } ...

  9. 1001. 杀死吸引力(3n+1)猜想 (15)(ZJUPAT 数学)

    主题链接:http://pat.zju.edu.cn/contests/pat-b-practise/1001 卡拉兹(Callatz)猜想: 对不论什么一个自然数n,假设它是偶数,那么把它砍掉一半. ...

  10. jquery-validate的用法

    默认校验规则 (1)required:true               必输字段(2)remote:"check.php"          使用ajax方法调用check.p ...