一、自定义Filter

自定义Filter需要继承ActionFilterAttribute抽象类,重写其中需要的方法,来看下ActionFilterAttribute类的方法签名。
  1. //表示所有操作-筛选器特性的基类。
  2. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
  3. public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter
  4. {
  5. protected ActionFilterAttribute();
  6. // 在Action执行之后由 MVC 框架调用。
  7. public virtual void OnActionExecuted(ActionExecutedContext filterContext);
  8. // 在Action执行之前由 MVC 框架调用。
  9. public virtual void OnActionExecuting(ActionExecutingContext filterContext);
  10. // 在执行Result后由 MVC 框架调用。
  11. public virtual void OnResultExecuted(ResultExecutedContext filterContext);
  12. // 在执行Result之前由 MVC 框架调用。
  13. public virtual void OnResultExecuting(ResultExecutingContext filterContext);
  14. }
因此自定义过滤器可以选择适当的方法来重写方可。下面来举个简单的例子:检查登录状态的过滤器,没有登录则跳转到登录页
控制器代码
  1. [CheckLogin]  //此处为自定义属性,要引用相应的命名空间
  2. public ActionResult Index()
  3. {
  4. return View();
  5. }
  6. public ActionResult Login()   //此Action自动往cookie里写入登录信息
  7. {
  8. HttpCookie hcUserName = new HttpCookie("username","admin");
  9. HttpCookie hcPassWord = new HttpCookie("password","123456");
  10. System.Web.HttpContext.Current.Response.SetCookie(hcUserName);
  11. System.Web.HttpContext.Current.Response.SetCookie(hcPassWord);
  12. return View();
  13. }
过滤器代码
  1. public class CheckLogin : ActionFilterAttribute
  2. {
  3. //在Action执行之前 乱了点,其实只是判断Cookie用户名密码正不正确而已而已。
  4. public override void OnActionExecuting(ActionExecutingContext filterContext)
  5. {
  6. HttpCookieCollection CookieCollect = System.Web.HttpContext.Current.Request.Cookies;if (CookieCollect["username"] == null || CookieCollect["password"] == null)
  7. {
  8. filterContext.Result = new RedirectResult("/Home/Login");
  9. }
  10. else
  11. {
  12. if (CookieCollect["username"].Value != "admin" && CookieCollect["password"].Value != "123456")
  13. {
  14. filterContext.Result = new RedirectResult("/Home/Login");
  15. }
  16. }
  17. }
  18. }//本示例贪图方便,将要跳转到的Action放在同一个Controller下了,如果将过滤器放到Controller类顶部,则永远也跳不到这个LoginAction。
此过滤器实现的效果是,当用户Cookie中用户名和密码不正确则跳转到登录页,注意过滤器也可以放在整个Controller类的顶部,表示该Controller下的
所有Action都执行该项检查。这样一来,控制器里的代码非常漂亮,再也不用所有的Action里都充斥着判断登录的代码了。

二、带参数的自定义Filter

首先,还是按照之前添加自定义过滤器的方法,添加一个自定义过滤器,只是里面多了一个属性,代码如下:

  1. public class FilterAttribute : ActionFilterAttribute
  2. {
  3. public string Message { get; set; }
  4. public override void OnActionExecuting(ActionExecutingContext filterContext)
  5. {
  6. base.OnActionExecuting(filterContext);
  7. filterContext.HttpContext.Response.Write("Action执行之前" + Message + "<br />");
  8. }
  9. public override void OnActionExecuted(ActionExecutedContext filterContext)
  10. {
  11. base.OnActionExecuted(filterContext);
  12. filterContext.HttpContext.Response.Write("Action执行之后" + Message + "<br />");
  13. }
  14. public override void OnResultExecuting(ResultExecutingContext filterContext)
  15. {
  16. base.OnResultExecuting(filterContext);
  17. filterContext.HttpContext.Response.Write("返回Result之前" + Message + "<br />");
  18. }
  19. public override void OnResultExecuted(ResultExecutedContext filterContext)
  20. {
  21. base.OnResultExecuted(filterContext);
  22. filterContext.HttpContext.Response.Write("返回Result之后" + Message + "<br />");
  23. }
  24. }
然后在调用过滤器的时候,添加上该参数,Controller代码如下:
  1. [Filter(Message="刘备")]  //参数给上
  2. public ActionResult Index()
  3. {
  4. return View();
  5. }
输出结果如下:

如果标签打到Controller上的话,TestFilterAttributeFilter将作用到Controller下的所有的Action。

  默认情况下Action上打了某个自定义标签后,虽然在Controller上也打上了此标签,但它只有Action上的标签起作用了。
  补充:如果Action没有打上该标签,那么Controller上的标签便会被执行。

  如果想让Action上的标签执行一次,然后Controller上的标签也执行一次,那么应该如何操作呢?

   我们只需在FilterAttribute类的定义上打上标记[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]即可【下面类的最上面红色字体部分】,也就是让其成为可以多次执行的Action。代码如下:

  1. [AttributeUsage(AttributeTargets.All,AllowMultiple = true)]
  2. public class FilterAttribute : ActionFilterAttribute
  3. {
  4. public string Message { get; set; }
  5. ......

三、全局过滤器 

有时我们想有些公共的方法需要每个Action都执行,但是又不想再每一个Controller上都打上Action标签,怎么办?幸好Asp。Net MVC3带来了一个美好的东西,全局Filter。而怎么注册全局Filter呢?答案就在Global.asax中。让我们看以下代码,我是如何将上面我们定义的TestFilterAttribute 注册到全局Filter中。
  1. public static void RegisterGlobalFilters(GlobalFilterCollection filters)
  2. {
  3. filters.Add(new HandleErrorAttribute());
  4. //注册全局过滤器
  5. filters.Add(new TestFilterAttribute() { Message="全局"});
  6. }

这样就每个Action都会执行此过滤器,而不必每个Controller顶部都加上标签。

转载于:https://www.cnblogs.com/shiyh/p/9469265.html

MVC之 自定义过滤器(ActionFilterAttribute)相关推荐

  1. asp.net MVC之 自定义过滤器(Filter)

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

  2. ASP.NET MVC ActionFilter自定义过滤器异常过滤器过滤器用法

    自定义过滤器使用非常灵活,可以精确的注入到请求前.请求中和请求后.继承抽象类ActionFilterAttribute并重写里面的方法即可: public class SystemLogAttribu ...

  3. MVC中的自定义过滤器

    过滤器的类型 ASP.NET MVC 框架支持以下几种过滤器:     1.Authorization 过滤器– 实现了 IAuthorizationFilter 接口.这一类的过滤器用来实现用户验证 ...

  4. .NET MVC过滤器ActionFilterAttribute验证权限以及Model

    项目使用.NET MVC开发,在开发过程中网站权限以及页面ViewModel的验证是比较常见的,本文主要记录在维护以前.NET MVC项目时将权限和Model的验证通过过滤器ActionFilterA ...

  5. ASP.NET MVC 4 (三) 过滤器

    先来看看一个例子演示过滤器有什么用: public class AdminController : Controller { // ... instance variables and constru ...

  6. SpringMVC配置自定义过滤器

    SpringMVC配置自定义过滤器 环境 开发工具: idea2019.3.5 springmvc版本: 5.1.9.RELEASE <dependency><groupId> ...

  7. 【AngularJS】—— 9 自定义过滤器

    AngularJS另一个特点就是提供了过滤器,可以通过操作UNIX下管道的方式,操作数据结果. 通过使用管道,可以便于双向的数据绑定中视图的展现. 过滤器在处理过程中,将数据变成新的格式,而且可以使用 ...

  8. springboot过滤字段_SpringBoot自定义过滤器的两种方式及过滤器执行顺序

    第一种 @WebFilter + @ServletComponentScan 注解 1.首先自定义过滤器 如下自定义过滤器 ReqResFilter必须实现  javax.servlet.Filter ...

  9. Django 框架13: 自定义过滤器和标签

    2019独角兽企业重金招聘Python工程师标准>>> Django的模板系统自带了一系列的内建标签和过滤器,一般情况下可以满足开发要求,如果觉得需更精准的模板标签或者过滤器,可以自 ...

最新文章

  1. 关于win2003服务器远程断开后自动注销的问题解决
  2. python抽奖概率设计_辞职转行不如学Python,那些下载安装的坑,你真的都避开了嘛?...
  3. express登录例子
  4. linux配置文件引用时间,linux时间设置、screen使用、命令分类、hash作用、命令引用及history命令...
  5. Docker Images for MySQL Cluster
  6. 10、Modules - LoadManual
  7. 电机学、电机拖动相关知识(试着更新电机的相关知识,感谢指出错误)
  8. OCR怎么能离开扫描仪呢?
  9. Java求所占百分比
  10. Java微信小程序的授权登陆
  11. 2022山东省安全员C证操作证考试题及答案
  12. NFM模型理论与实践
  13. 第十五周作业——ZJM与生日礼物
  14. appstore上传截图的各种尺寸
  15. Kafka从入门到精通学习笔记
  16. [轻笔记]Successor Features for Reinforcement learning
  17. 将无处不在的网络爬虫引向合法的轨道已迫在眉睫!
  18. 神经科学:探索脑(第四版)英文 读书笔记
  19. 杀毒软件的查杀病毒的原理以及木马、病毒的免杀伎俩(论杀或者不杀 )
  20. 电磁阀、比例阀门线性驱动器信号隔离与放大

热门文章

  1. bat 等待输入_深蓝词库转换 - 简单的输入法词库转换工具
  2. 现在企业编程用java还是python_想转行做程序员,是学习 Java 还是 Python 更好?
  3. 使用说明_无线投屏器使用说明教程
  4. Struts初学者教程
  5. android自定义进度条_Android中的自定义进度栏
  6. json.parser性能_Jackson JSON Java Parser API示例教程
  7. Gse v0.40.0 发布,Go 高性能分词,增加更多常用 API
  8. 网络运维常见交换机故障
  9. zabbix4.0.1中文乱码问题
  10. 「深度」5G,真的有必要在2020年占领我们吗?