1、为什么要用到过滤器。
2、它能解决什么问题
3、是否会带来新问题,严重不,我们是否能够解决掉?
在实际项目中,稍微像样点的项目总会有一些相关的AOP(面向切面,也叫做面向面)编程的组件,而MVC项目中太关心我们这些农民工啦,不想让MVC开发人员去为了身份验证、日志、异常等部分重复代码。于是我们在MVC项目中就可以直接使用它提供的Fileter特性帮我们解决,不用我们自己去实现复杂的AOP了。
以日志为例(记录操作日志):
[C#] 纯文本查看 复制代码 [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中还有哪些场合会用到过滤器呢?
1.判断登录与否或用户权限
2.决策输出缓存
3.防盗链
4.防蜘蛛
5.本地化与国际化设置
6.实现动态Action
|