架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 14362|回复: 3

[ASP.NET] mvc 自定义过滤器ActionFilterAttribute类

[复制链接]
发表于 2016-1-6 15:32:33 | 显示全部楼层 |阅读模式

万一前面介绍的过滤器也满足不了需求,要在行为方法执行返回的前前后后定义自己的处理逻辑的话,这个自定义过滤器就应该能派上用场了。若要自定义一个过滤器,则要继承ActionFilterAttribute类,这个类是一个抽象类,实现了IActionFilter和IResultFilter接口,主要通过重写四个虚方法来达到在行为方法执行和返回的前后注入逻辑

方法
参数
描述
OnActionExecuting
ActionExecutingContext
在行为方法执行前执行
OnActionExecuted
ActionExecutedContext
在行为方法执行后执行
OnResultExecuting
ResultExecutingContext
在行为方法返回前执行
OnResultExecuted
ResultExecutedContext
在行为方法返回后执行

  四个方法执行顺序是OnActionExecuting——>OnActionExecuted——>OnResultExecuting——>OnResultExecuted。上面四个方法的参数都是继承基ContollorContext类。例如下面定义了一个自定义的过滤器


  1. public class MyCustomerFilterAttribute : ActionFilterAttribute
  2.     {
  3.         public string Message { get; set; }

  4.         public override void OnActionExecuted(ActionExecutedContext filterContext)
  5.         {
  6.             base.OnActionExecuted(filterContext);
  7.             filterContext.HttpContext.Response.Write(string.Format( "<br/> {0} Action finish Execute.....",Message));
  8.         }

  9.         public override void OnActionExecuting(ActionExecutingContext filterContext)
  10.         {
  11.             CheckMessage(filterContext);
  12.             filterContext.HttpContext.Response.Write(string.Format("<br/> {0} Action start Execute.....", Message));
  13.             base.OnActionExecuting(filterContext);
  14.         }

  15.         public override void OnResultExecuted(ResultExecutedContext filterContext)
  16.         {
  17.             filterContext.HttpContext.Response.Write(string.Format("<br/> {0} Action finish Result.....", Message));
  18.             base.OnResultExecuted(filterContext);
  19.         }

  20.         public override void OnResultExecuting(ResultExecutingContext filterContext)
  21.         {
  22.             filterContext.HttpContext.Response.Write(string.Format("<br/> {0} Action start Execute.....", Message));
  23.             base.OnResultExecuting(filterContext);
  24.         }

  25.         private void CheckMessage(ActionExecutingContext filterContext)
  26.         {
  27.             if(string.IsNullOrEmpty( Message)||string.IsNullOrWhiteSpace(Message))
  28.                 Message = filterContext.Controller.GetType().Name + "'s " + filterContext.ActionDescrip{过滤}tor.ActionName;
  29.         }
  30.     }
复制代码

使用它的行为方法定义如下

  1. [MyCustomerFilter]
  2.         public ActionResult CustomerFilterTest()
  3.         {
  4.             Response.Write("<br/>Invking CustomerFilterTest Action");
  5.             return View();
  6.         }
复制代码







上一篇:知名主机服务商Linode疑似被黑 用户需尽快更改密码
下一篇:Memcache 查看列出所有key方法
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2016-10-25 10:00:36 | 显示全部楼层
  1. public class SignatureAttribute : ActionFilterAttribute
  2.     {
  3.         public override void OnActionExecuting(ActionExecutingContext filterContext)
  4.         {
  5.             SortedDictionary<string, string> requestDic = new SortedDictionary<string, string>();
  6.             foreach(var item in filterContext.HttpContext.Request.QueryString.AllKeys)
  7.             {
  8.                 requestDic.Add(item, filterContext.HttpContext.Request.QueryString[item]);
  9.             }
  10.             //时间戳timestamp  随机数nonce  签名signature
  11.             if (requestDic.Keys.Any(m => m.Equals("timestamp", StringComparison.OrdinalIgnoreCase)) && requestDic.Keys.Any(m => m.Equals("nonce", StringComparison.OrdinalIgnoreCase)) && requestDic.Keys.Any(m => m.Equals("signature", StringComparison.OrdinalIgnoreCase)))
  12.             {
  13.                 filterContext.Result = new JsonResult
  14.                 {
  15.                     Data = new { url = "http://www.itsvse.com" },
  16.                     ContentEncoding = System.Text.Encoding.UTF8,
  17.                     ContentType = "application/json",
  18.                     JsonRequestBehavior = JsonRequestBehavior.AllowGet
  19.                 };
  20.             }
  21.             base.OnActionExecuting(filterContext);
  22.         }
  23.     }
复制代码


码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2019-8-10 22:16:41 | 显示全部楼层
.net Mvc 过滤器执行顺序:

IAuthorizationFilter(OnAuthorization)----->IActionFilter(OnActionExecuting)---->

控制器Action()---->IActionFilter(OnActionExecuted) ---->IResultFilter(OnResultExecuting)---->

视图view()---->IResultFilter(OnResultExecuted)

另外,同一过滤器执行顺序:从上到下,就近原则:


  1. [Filter1]
  2. [Filter2]
  3. public ActionResult DoAction(){}
复制代码


Filter2=>Filter1
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-8-26 13:24:19 | 显示全部楼层
mark,学习了
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-12-15 02:46

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表