https://blog.csdn.net/knqiufan/article/details/82413885
本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/knqiufan/article/details/82413885参考文章:1、https://www.cnblogs.com/webapi/p/5669057.html 2、https://shiyousan.com/post/635835285087587126 在MVC中有一个过滤机制,可以编写为过滤器或拦截器,用于对在某个Action执行前后再执行的动作。 过滤器继承自ActionFilterAttribute类(命名空间是System.Web.Mvc)
ActionFilterAttribute类是一个特性类。 在菜鸟教程中,对特性是这么描述的:(链接:http://www.runoob.com/csharp/csharp-attribute.html) 特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。 特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。.Net 框架提供了两种类型的特性:预定义特性和自定义特性 ActionFilterAttribute实现了两个很重要的接口:IActionFilter,IResultFilter
ActionFilterAttribute实现了它们,那么自然也拥有这四个方法 首先,IActionFilter接口的 OnActionExecuting方法和OnActionExecuted方法: //该方法会在action方法执行之前调用 public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.HttpContext.Response.Write("我是OnActionExecuting,我在action方法调用钱执行<br/>"); base.OnActionExecuting(filterContext); } //该方法会在action方法执行之后调用 public override void OnActionExecuted(ActionExecutedContext filterContext) { filterContext.HttpContext.Response.Write("我是OnActionExecuted,我在action方法调用后执行<br/>"); base.OnActionExecuted(filterContext); } 调用的时候直接这么调用: [MyFilter] public void FilterTest() { Response.Write("我是action方法,在这里执行了</br>"); }要在一个action方法中使用一个过滤器,只要在该方法上贴一个过滤器的标签就ok了。 但是有时候我们会有这样的一需求: 在过滤器中当遇到了贴了某某标签的action方法就跳过不进行验证 这怎么办呢? 可以通过filterContext的ActionDescriptor属性类完成这易操作 ActionDescriptor顾名思义,action方法的描述着 在ActionDescriptor中我们可以拿到相应的action方法信息,甚至还可以拿到一个控制器描述着ControllerDescriptor 代码如下: //该方法会在action方法执行之前调用 public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.HttpContext.Response.Write("我是OnActionExecuting,我在action方法调用前执行<br/>"); //判断该action方法时候有贴上MyFilter1Attribute标签 if (filterContext.ActionDescriptor.IsDefined(typeof (MyFilter1Attribute),false)) { //如果有,为该action方法直接返回ContentResult,则该action方法在这里就有了返回值,相当于在这里就结束了,不会在去执行之后的方法,如:OnActionExecuted等 filterContext.Result = new ContentResult(); } base.OnActionExecuting(filterContext); }这样action方法中和OnActionExecuted中的Response.Write都没有被执行,也就是说,该action方法被跳过了 接下来看看IResultFilter接口的两个方法:OnResultExecuting方法和OnResultExecuted方法 //在action方法返回结果之后执行 public override void OnResultExecuting(ResultExecutingContext filterContext) { filterContext.HttpContext.Response.Write("我是OnActionExecuting,我action方法返回结果之前执行<br/>"); base.OnResultExecuting(filterContext); } //在action方法返回结果之前前执行 public override void OnResultExecuted(ResultExecutedContext filterContext) { filterContext.HttpContext.Response.Write("我是OnResultExecuted,我在action方法返回结果之后执行<br/>"); base.OnResultExecuted(filterContext); }使用方法和IActionFilter的使用方法是一样的。 IResultFilter接口中的方法和IActionFilter方法的区别就是执行位置不一样。 mvc框架中还有一个过滤器,他就是权限过滤器AuthorizeAttribute 该过滤器在所有action方法过滤器之前执行,也就是说,提供了一个可以超前验证的方法 我们在添加一个新的过滤器类,并继承自AuthorizeAttribute 重写其OnAuthorization方法如下: 【注意,把基类的OnAuthorization方法去掉,因为我们并不需要,而且留着可能会出现一些错误异常】 public class MyFilterReAttribute:AuthorizeAttribute { //在所有action方法过滤器之前执行 public override void OnAuthorization(AuthorizationContext filterContext) { filterContext.HttpContext.Response.Write("我是OnAuthorization,在所有action方法过滤器之前执行<br/>"); //base.OnAuthorization(filterContext); } } [MyFilter] [MyFilterRe] public ActionResult FilterTest() { Response.Write("我是action方法的Response.Write,在这里执行了~~</br>"); return View(); }运行之后:
这样我们就可以根据需要选择合适的方法进行权限验证,过滤,拦截等等动作。 如果控制器中的所有action都需要验证等,那么就可以在控制类中统一贴上标签:
这样该控制器中的所有action方法都会进行验证 那么,如果每个控制器都需要验证、过滤、拦截呢? 这个时候就需要打开App_Start文件夹,打开FilterConfig类,在这里面添加全局的过滤器:
下面简单说一下FilterConfig类。 在Global.asax文件中,FilterConfig类是全局Filter的管理器:
FilterConfig类在项目的App_Start文件夹下:
默认已经注册了一个HandleErrorAttribute类(异常过滤器),我们可以通过GlobalFilterCollection 类对全局过滤器进行管理,比如对全局过滤器进行注册、删除和管理运行顺序等操作
【备注:所谓的全局过滤器,就是会应用到所有操作方法和控制器的过滤器,一旦在FilterConfig类中注册了某个过滤器,就不需要再额外去控制器中声明。】 --------------------- 作者:knqiufan 来源:CSDN 原文:https://blog.csdn.net/knqiufan/article/details/82413885 版权声明:本文为博主原创文章,转载请附上博文链接!
|
请发表评论