自定义的action过滤器  需要继承自ActionFilterAttribute 接口

OnActionExecuting:  在方法执行之前执行

OnActionExecuted:  方法的逻辑代码执行完成之后触发

OnResultExecuting: 方法在准备放回结果的时候触发

OnResultExecuted:方法返回结果之后触发

  1. /// <summary>
  2. /// 自定义的action过滤器 和result过滤器
  3. /// </summary>
  4. public class ActionFilterDemo : ActionFilterAttribute
  5. {
  6. /// <summary>
  7. /// 在方法执行之前被触发
  8. /// </summary>
  9. /// <param name="filterContext"></param>
  10. public override void OnActionExecuting(ActionExecutingContext filterContext)
  11. {
  12. //判断如果在控制器上贴有SkipAttribute特性标签则跳过下面代码的执行
  13. if (filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(SkipAttribute), false))
  14. {
  15. return;
  16. }
  17.  
  18. filterContext.HttpContext.Response.Write("1 、OnActionExecuting----<br />");
  19.  
  20. //1.0 获取触发当前方法的action名称
  21. var actionName = filterContext.ActionDescriptor.ActionName;
  22.  
  23. //2.0 获取action方法所在的控制器
  24. var cName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
  25. filterContext.HttpContext.Response.Write(" 1.1 、控制器+action=" + cName + actionName + "<br />");
  26.  
  27. //3.0 获取action的参数
  28. string res = "无参数";
  29. var prmas = filterContext.ActionParameters;
  30. if (prmas != null && prmas.Any())
  31. {
  32. res = "";
  33. //打印参数名称和值
  34. foreach (var ps in prmas)
  35. {
  36. res += "参数名称=" + ps.Key + ",参数值=" + ps.Value + " | ";
  37. }
  38. }
  39. filterContext.HttpContext.Response.Write(" 1.2 、参数结果:" + res + "<br />");
  40.  
  41. //4.0 获取当前action上的指定的特性标签HttpGet
  42. object[] atts = filterContext.ActionDescriptor.GetCustomAttributes(typeof(HttpGetAttribute), false);
  43. var allAtts = filterContext.ActionDescriptor.GetCustomAttributes(false);//获取所有的特性标签
  44.  
  45. //4.0.1 判断当前action方法上是否贴有HttpGet的特性标签
  46. bool isok = filterContext.ActionDescriptor.IsDefined(typeof(HttpGetAttribute), false);
  47.  
  48. //5.0 获取当前aciton所在的控制器上的特性标签和判断特性标签
  49. var allcatts = filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(false);
  50. var isOK1 = filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(HttpGetAttribute), false);
  51.  
  52. //6.0 其实OnActionExecuting是在方法执行之前执行的 那么当然也可以用来改造验证同意登陆啦 下面是我自己的尝试
  53.  
  54. //获取当前登录url 登陆完毕需要跳转回来的
  55. bool isLogin=false; //根据项目的登陆方式判断是否登陆
  56. if (!isLogin)
  57. {
  58. string call_back = System.Web.HttpContext.Current.Request.Url.ToString();
  59. ContentResult result = new ContentResult();
  60. result.Content = "<script>alert('请先登录');window.location.href='http://www.xxoo.com/Passport/Login?callback_url=" + call_back + "'</script>";
  61. filterContext.Result = result;
  62. return;
  63. }
  64. base.OnActionExecuting(filterContext);
  65. }
  66.  
  67. /// <summary>
  68. /// 方法逻辑代码执行以后被触发
  69. /// </summary>
  70. /// <param name="filterContext"></param>
  71. public override void OnActionExecuted(ActionExecutedContext filterContext)
  72. {
  73. filterContext.HttpContext.Response.Write("3 、OnActionExecuted----<br />");
  74. base.OnActionExecuted(filterContext);
  75. }
  76.  
  77. /// <summary>
  78. /// 方法准备返回结果的时候被触发
  79. /// </summary>
  80. /// <param name="filterContext"></param>
  81. public override void OnResultExecuting(ResultExecutingContext filterContext)
  82. {
  83. filterContext.HttpContext.Response.Write("4 、OnResultExecuting----<br />");
  84. base.OnResultExecuting(filterContext);
  85. }
  86.  
  87. /// <summary>
  88. /// 方法返回结果后被触发
  89. /// </summary>
  90. /// <param name="filterContext"></param>
  91. public override void OnResultExecuted(ResultExecutedContext filterContext)
  92. {
  93. filterContext.HttpContext.Response.Write("6 、OnResultExecuted----<br />");
  94. base.OnResultExecuted(filterContext);
  95. }
  96. }

自定义异常过滤器 继承自HandleErrorAttribute接口

OnException: 该接口 用户不扣action中没有被try{} catch包括的异常

  1. /// <summary>
  2. /// 作用:用于捕获action中的未被try{}catch{}捕获的异常
  3. /// </summary>
  4. public class ExpAttribute : HandleErrorAttribute
  5. {
  6. public override void OnException(ExceptionContext filterContext)
  7. {
  8.  
  9. //1.0获取异常信息
  10. Exception exp = filterContext.Exception;
  11.  
  12. //2.0 将信息写入日志或者db中方便查询
  13. // System.IO.File.AppendAllText(filterContext.HttpContext.Server.MapPath("/Log/log.txt"), exp.ToString());
  14.  
  15. //3.0 通知MVC框架,现在这个异常已经被我处理掉,你不需要将黄页显示给用户
  16. filterContext.ExceptionHandled = false;
  17.  
  18. //4.0 跳转到错误提醒页面
  19. //filterContext.Result
  20. filterContext.HttpContext.Response.Redirect("/Error/Error", true);
  21.  
  22. base.OnException(filterContext);
  23. }
  24. }

其实自定义错误页面还可以换个姿势

在Web.config中配置

<customErrors mode="Off" defaultRedirect="Error">       这里的Error页面是views/shared/Error.cshtml页面    
<!--<error statusCode="404" redirect="/Error/404" />-->  statusCode  定义的 是错误类型      这里的redirect    是自定义的错误页面
</customErrors>

------------------------------最后将过滤器注入到Global.asax文件中

  1. public class FilterConfig
  2. {
  3. public static void RegisterGlobalFilters(GlobalFilterCollection filters)
  4. {
  5. filters.Add(new HandleErrorAttribute());
  6.  
  7. //将ActionFilterDemo 注册成为一个全局过滤器,实现当前网站中的任何action方法被执行的时候都
  8. //会触发过滤器中的相关方法
  9. filters.Add(new ActionFilterDemo());
  10. filters.Add(new AuthAttribute());
  11.  
  12. filters.Add(new ExpAttribute());
  13. }
  14. }
  1. public class MvcApplication : System.Web.HttpApplication
  2. {
  3. protected void Application_Start()
  4. {
  5. AreaRegistration.RegisterAllAreas();
  6.  
  7. WebApiConfig.Register(GlobalConfiguration.Configuration);
  8. FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); //自定义的过滤器
  9. RouteConfig.RegisterRoutes(RouteTable.Routes);
  10. BundleConfig.RegisterBundles(BundleTable.Bundles);
  11. }
  12. }

MVC过滤器-->ActionFilterAttribute和HandleErrorAttribute的更多相关文章

  1. MVC 过滤器 ActionFilterAttribute

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  2. mvc过滤器学习(1)

    mvc 过滤器结构图 AuthorizeAttribute AuthorizeAttribute是IAuthorizationFilter的默认实现,添加了Authorize特性的Action将对用户 ...

  3. ASP.NET MVC过滤器

    在ASP.NET MVC中有个重要特性就是过滤器,使得我们在MVC程序开发中更好的控制浏览器请求的URL,不是每个请求都有响应内容,只有特定得用户才有.园子里关于过滤器的资料也有很多,这篇文章主要是记 ...

  4. MVC过滤器详解

    MVC过滤器详解   APS.NET MVC中(以下简称"MVC")的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理. ...

  5. ASP.NET MVC过滤器(一)

    MVC过滤器是加在 Controller 或 Action 上的一种 Attribute,通过过滤器,MVC 网站在处理用户请求时,可以处理一些附加的操作,如:用户权限验证.系统日志.异常处理.缓存等 ...

  6. MVC过滤器详解和示例

    原文  http://blog.csdn.net/ankeyuan/article/details/29624005 MVC过滤器一共分为四个:ActionFilter(方法过滤器),ResultFi ...

  7. NET MVC过滤器

    NET MVC过滤器 本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在ASP.NET MVC中有四种过滤器类型

  8. MVC过滤器简单理解

    之前对于MVC过滤器的理解一直处于很模糊的状态,就在网上找了一些很简单的案例做了一下学习,就找了一个比较容易理解的demo分享给大家. 新建一个MVC4项目,可以在global.asax文件中看到如下 ...

  9. ASP.NET MVC 过滤器(五)

    ASP.NET MVC 过滤器(五) 前言 上篇对了行为过滤器的使用做了讲解,如果在控制器行为的执行中遇到了异常怎么办呢?没关系,还好框架给我们提供了异常过滤器,在本篇中将会对异常过滤器的使用做一个大 ...

随机推荐

  1. jQuery 删除行(带跨行的表格)

    jQuery 删除行(带跨行的表格) 实现效果,点击删除按钮后,在保证原来表格结构的基础上,移除当前行. 代码原理: 1.点击行后判断当前行的第一个<td>,是否包含rowspan属性,如 ...

  2. JQ-jQuery-Ajax:jQuery Ajax 操作函数

    ylbtech-JQ-jQuery-Ajax:jQuery Ajax 操作函数 1.返回顶部 1. jQuery Ajax 操作函数 jQuery 库拥有完整的 Ajax 兼容套件.其中的函数和方法允 ...

  3. PHP-版本问题

    PHP 5.3 以下版本 无法用下标直接取得函数返回的数组 eg: $val_0 = explode(',', $val)[0]//报错 #要改成: $exploded_val = explode(' ...

  4. 54、tensorflow手写识别的高级版本

    ''' Created on 2017年3月4日 @author: weizhen ''' import tensorflow as tf def weight_variable(shape): in ...

  5. RabbitMQ(七)心跳控制 -- heartbeat

    https://blog.csdn.net/jiao_fuyou/article/details/23186407

  6. PouchContainer 容器技术演进助力阿里云原生升级

    点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 作者 | 杨育兵(沈陵) 阿里巴巴高级技术专家 我们从 2016 年开始在集团推广全面的镜像化容器化,今年是集团全面镜像化容器 ...

  7. Java学习之抽象类

    抽象类特点: 1.抽象方法必须定义在抽象类中2.abstract关键字修饰:只能修饰类和方法3.抽象类不能实例化4.抽象类中的方法要被使用,必须由子类重写所有的抽象方法,实例化其子类 如果子类只重写部 ...

  8. 数据访问层的接口IBaseDAL

    using System; using System.Collections; using System.Data; using System.Data.Common; using System.Co ...

  9. Nginx网络架构实战学习笔记(五):大访问量优化整体思路、ab压力测试及nginx性能统计模块、nginx单机1w并发优化

    文章目录 大访问量优化整体思路 ab压力测试及nginx性能统计模块 ab压力测试及nginx性能统计模块 ab压力测试 nginx性能统计模块 nginx单机1w并发优化 整装待发: socket ...

  10. Python变量的下划线

    xx: 公有变量 _x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问 __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部 ...