mvc 筛选器
之前公司中,运用ActionFilterAttribute特性实现用户登录信息的验证,没事看了看,留下点东西备忘。
好的,瞅这玩意一眼就大概能猜到这货是干嘛的了吧,没错,action过滤器。其实就是AOP的思想,将我们的逻辑或业务进行了分片,使我们更加专注于业务的实现。不太清楚的娃子可以度娘下。(其实我也不是很了解,有空再把AOP深入了解下)
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
    public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter
首先从名称我们就知道,这是一个特性,这个特性可以用于类,用于方法,可被继承,能否加多个实例(AllowMultiple = false 获取或设置一个布尔值,该值指示能否为一个程序元素指定多个指示属性实例)。
他继承了FilterAttribute,IActionFilter,IResultFilter
那好,为了详细了解这个特性是干嘛呢,我们一个个看起
1,这尼玛一个个用语言描述定义太麻烦,借用园子中一童鞋的图(原文:http://www.cnblogs.com/darkdawn/archive/2008/07/20/1247022.html)

这一眼就清晰多了,不过这个图也不够全面,不过也不是很重要(感兴趣的童鞋可以查一下大概的层次结构),FilterAttribute(表示操作和结果筛选器特性的基类。)其实还继承了IMvcFilter,接口。(定义用于指定筛选器顺序以及是否允许多个筛选器的成员。)
哦,大概了解了点,IMvcFilter定义了筛选器的基本功能,执行顺序,是否能多筛选,
FilterAttribute 是各类筛选器的基类
ActionFilterAttribute 这是实现action的筛选的抽象类
AuthorizeAttribute 这是实现用户身份验证的特性类
HandleErrorAttribute 这是处理异常的特性类
(public class AuthorizeAttribute : FilterAttribut, IAuthorizationFilter)
(public class HandleErrorAttribute : FilterAttribute,IExceptionFilter)
嗯,到现在,了解了一些了。
继续看ActionFilterAttribute ,还有两个接口IActionFilter,IResultFilter。
看名称大致就能猜到一个是action过滤器的接口,一个是结果过滤的接口
看了一下,其实就是定义了开始前后执行的两个方法
| 
 OnActionExecuted  | 
 在执行操作方法后由 MVC 框架调用。  | 
|
| 
 OnActionExecuting  | 
 在执行操作方法之前由 MVC 框架调用。  | 
|
| 
 OnResultExecuted  | 
 在执行操作结果后由 MVC 框架调用。  | 
|
| 
 OnResultExecuting  | 
 在执行操作结果之前由 MVC 框架调用。  | 
Ok,现在基本就清楚了,大致思路就是,比如商城中,订单页面需要用户登录,那么其实对应到我们的处理就是,在订单页面开始之前,验证用户是否登录,其实就是在页面的action执行之前进行验证。那我们就可以自己写一个UserLoginAttribute,继承ActionFilterAttribute,实现OnActionExecuting这个方法,在其中验证。然后我们需要用户登录的action加上所需标签即可(controller或者全局的都行)。
现在我们要重构代码,统一处理异常信息。查一下,哦,有这么个玩意HandleErrorAttribute ,大致东西跟其他过滤器是一样的,只不过这个类不是抽象类罢了
而且用的时候需要改下配置文件
(http://msdn.microsoft.com/zh-cn/library/system.web.mvc.handleerrorattribute(v=vs.118).aspx)
这里有篇异常处理的例子,很简单,童鞋么可以看一下(http://www.cnblogs.com/pengzhen/p/3774814.html)。
Mvc内置了四种筛选器(AuthorizationFilter、ActionFilter、ResultFilter和ExceptionFilter),它们对应着相应的筛选器接口(IAuthorizationFilter、IActionFilter、IResultFilter和IExceptionFilter)
这里关于筛选器的实现Filter,FilterProvider以及各筛选器的执行顺序,Artech有篇深入讲解的文章,(http://www.cnblogs.com/artech/archive/2012/07/02/filter.html)
对着源码看一遍,还是很能提高对筛选器的实现的理解的。尼玛基本看的差不多了,试试吧。
mvc 筛选器的更多相关文章
- Asp.Net mvc筛选器中返回信息中断操作
		
在mvc中,使用response.end()或Response.Redirect("url"); 是无法阻止请求继续往下执行的.如果在action中,可以我们可以使用return ...
 - 基础教程:ASP.NET Core 2.0 MVC筛选器
		
问题 如何在ASP.NET Core的MVC请求管道之前和之后运行代码. 解 在一个空的项目中,更新 Startup 类以添加MVC的服务和中间件. publicvoid ConfigureServi ...
 - Mbp通过筛选器和中间件实现异常,日志,事务及接口返回数据格式化aop处理.
		
Mbp应用服务层的AOP实现 实现方法:asp.net core mvc 筛选器 + 中间件 日志,事务,和接口返回结果统一格式化采用操作筛选器,而异常处理采用中间件来处理. 最开始,我是打算用aut ...
 - Asp.Net MVC 页面代码压缩筛选器-自定义删除无效内容
		
Asp.Net MVC 页面代码压缩筛选器 首先定义以下筛选器,用于代码压缩. /*页面压缩 筛选器*/ public class WhiteSpaceFilter : Stream { privat ...
 - MVC四大筛选器—ExceptionFilter
		
该筛选器是在系统出现异常时触发,可以对抛出的异常进行处理.所有的ExceptionFilter筛选器都是实现自IExceptionFilter接口 public interface IExceptio ...
 - MVC四大筛选器—ActionFilter&ResultedFilter
		
AuthorizeFilter筛选器 在Action的执行中包括两个重要的部分,一个是Action方法本身逻辑代码的执行,第二个就是Action方法的筛选器的执行. MVC4中筛选器都是以AOP(面向 ...
 - 如何在ASP.NET MVC为Action定义筛选器
		
在ASP.NET MVC中,经常会用到[Required]等特性,在MVC中,同样可以为Action自定义筛选器,来描述控制器所遵守的规则. 首先,我们在ASP.NET MVC项目中定义一个TestC ...
 - MVC四大筛选器—AuthorizeFilter
		
在Action的执行中包括两个重要的部分,一个是Action方法本身逻辑代码的执行,第二个就是Action方法的筛选器的执行. MVC4中筛选器都是以AOP(面向方面编程)的方式来设计的,通过对Act ...
 - ASP.NET MVC 如何使用自定义过滤器(筛选器)
		
继承*****Attribute(筛选器三种具体类)-->重写方法-->标记在控制器 或者 方法上面 或者 在FilterConfig中Add [类名(类属性 = 值)]还有[AllowA ...
 
随机推荐
- VMware下ubuntu与Windows实现文件共享的方法
			
最近安装caffe需要将Windows下文件拷贝到ubuntu16.04下,就进行了共享文件夹的设置,期间遇到一些困难,记录下来,方便以后遇到此类问题不再困惑. (记录只为更好的分享) 言归正传: 1 ...
 - docker X509 证书错误的终极解决办法
			
最近在做Docker相关的东西,发现只要一pull镜像,就出现如下的ERROR x509: certificate signed by unknown authority. 调查后发现,是公司IT把h ...
 - Yii2 Pjax 与 ActionForm ,不刷新提交数据
			
<?php yii\widgets\Pjax::begin(['id'=>'phoneDetail']);?> <?php $form = ActiveForm::begin( ...
 - R处理大数据集
			
R会把所有的对象读存入虚拟内存中.对我们大多数用户来说,这种设计可以提高与R相互的速度,但是当分析大数据集时,这种设计会降低程序运行速度有时还会产生跟内存相关的错误. 内存限制主要取决于R的build ...
 - redux三个基本原则
			
(1)单一数据源:整个应用的state被存储在一棵object tree中,并且这个object tree只存在于唯一一个store中: (2)state是只读的:唯一改变state的方法就是触发ac ...
 - Cordova原理一
			
我们知道cordova中js要和native通信都是通过 cordova plugin来实现的.如果我们自己创建一个cordova plugin,它其实就是几个独立的文件按照一定的目录结构放在一起,然 ...
 - mac下常用软件整理
			
1.非常好用的压缩管理软件(免费版):RAR Extrator Free 解压的中文不会产生乱码: 2.记笔记用的:有道笔记.Evernote 3.SVN管理软件:ConerStone 4.非常给力 ...
 - javascript面向对象(一)
			
javascript是弱类型,直译式的面相对象编程语言. 在之前我们说过 var a = 123: 在这里a是整数 但是我们可以给a重新复制为 a="你好"; 在这个过程中变量a ...
 - 通过composer管理工具安装laravel
			
当安装好composer管理工具后,将composer的bin目录添加至环境变量中(PATH),方便在任意目录下执行composer命令. 方法1:我们通过laravel工具安装laravel 首先, ...
 - [Python]获取子线程异常信息
			
起因 今天在写东西的时候,用到了多线程.遇到了个问题: 子线程的异常,在父线程中无法捕获. 解决 问题代码 问题代码示例代码如下: import threading class SampleThrea ...