一、知识了解

  1. Asp.Net MVC提供了以下几种默认的Filter:
  2. 大家注意一点,Asp.Net MVC提供的ActionFilterAttribute默认实现了IActionFilter和IResultFilter。而ActionFilterAttribute是一个Abstract的类型,所以不能直接使用,因为它不能实例化,所以我们想使用它必须继承一下它然后才能使用。

    Filter继承于ActionFilterAttribute抽象类,并可以覆写
    void OnActionExecuting(ActionExecutingContext)                                                                                                                                    
    voidOnActionExecuted(ActionExecutedContext)                                                                                                                                                
    void OnResultExecuting(ResultExecutingContext)                                                                                                                                                          
    void OnResultExecuted(ResultExecutedContext)。

  3. 它们的执行先后顺序如下:

  OnActionExecuting是Action执行前的操作

  OnActionExecuted则是Action执行后的操作

  OnResultExecuting是解析ActionResult前执行

  OnResultExecuted是解析ActionResult后执行

接下来我们只要对以上的方法进行重写就可以在相应的步骤做一些操作了。
二、实操
       1.首先添加一个普通的类TestFilterAttribute,这个类要继承ActionFilterAttribute,代码如下

  1. /// <summary>
  2. 2 /// Filter 执行顺序Test,需要继承筛选器的基类ActionFilterAttribute
  3. 3 /// </summary>
  4. 4 public class TestFilterAttribute : ActionFilterAttribute
  5. 5 {
  6. 6 public string Message { get; set; }
  7. 7
  8. 8 public override void OnActionExecuting(ActionExecutingContext filterContext)
  9. 9 {
  10. 10 base.OnActionExecuting(filterContext);
  11. 11 filterContext.HttpContext.Response.Write("Action执行之前" + Message + "<br />");
  12. 12 }
  13. 13
  14. 14 public override void OnActionExecuted(ActionExecutedContext filterContext)
  15. 15 {
  16. 16 base.OnActionExecuted(filterContext);
  17. 17 filterContext.HttpContext.Response.Write("Action执行之后" + Message + "<br />");
  18. 18 }
  19. 19
  20. 20 public override void OnResultExecuting(ResultExecutingContext filterContext)
  21. 21 {
  22. 22 base.OnResultExecuting(filterContext);
  23. 23 filterContext.HttpContext.Response.Write("返回Result之前" + Message + "<br />");
  24. 24 }
  25. 25
  26. 26 public override void OnResultExecuted(ResultExecutedContext filterContext)
  27. 27 {
  28. 28 base.OnResultExecuted(filterContext);
  29. 29 filterContext.HttpContext.Response.Write("返回Result之后" + Message + "<br />");
  30. 30 }
  31. 31 }

写完这个代码后,我们回到Action上,打上上面的标记如下所示:

  1. [TestFilterAttribute(Message = "Action")]
  2. 2 public ActionResult Index()
  3. 3 {
  4. 4 HttpContext.Response.Write("Action正在执行···<br />");
  5. 5 return Content("正在返回Result···<br />");
  6. 6 }

执行结果:

*如果我们将此标签打到Controller上的话,TestFilterAttributeFilter将作用到Controller下的所有的Action

*默认情况下Action上打了TestFilterAttribute 标签后,虽然在Controller上也打上了此标签,但它只有Action上的标签起作用了。

*补充:如果Action没有打上TestFilterAttribute标签,那么Controller上的标签便会被执行。

 

Index 执行时,Filter的方法只执行了一次,而某些情况下我们也想让Controller上的FilterAttribute也执行一次TestFilterAttribute,那我们怎么才能让Controller上的[TestFilter(Message = "controller")]也起作用呢?

答案是:我们只需在TestFilterAttribute类的定义上打上标记[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]即可,也就是让其成为可以多次执行的Action。代码如下:

  1. /// <summary>
  2. /// Filter 执行顺序Test,需要继承筛选器的基类ActionFilterAttribute
  3. /// </summary
  4. [AttributeUsage(AttributeTargets.All, AllowMultiple = true)] //打标记是让所有的Controller的标记生效
  5. public class TestFilterAttribute : ActionFilterAttribute
  6. {
  7. public string Message { get; set; }
  8. public override void OnActionExecuting(ActionExecutingContext filterContext)
  9. {
  10. base.OnActionExecuting(filterContext);
  11. filterContext.HttpContext.Response.Write("Action执行之前" + Message + "<br />");
  12. }
  13. public override void OnActionExecuted(ActionExecutedContext filterContext)
  14. {
  15. base.OnActionExecuted(filterContext);
  16. filterContext.HttpContext.Response.Write("Action执行之后" + Message + "<br />");
  17. }
  18. public override void OnResultExecuting(ResultExecutingContext filterContext)
  19. {
  20. base.OnResultExecuting(filterContext);
  21. filterContext.HttpContext.Response.Write("返回Result之前" + Message + "<br />");
  22. }
  23. public override void OnResultExecuted(ResultExecutedContext filterContext)
  24. {
  25. base.OnResultExecuted(filterContext);
  26. filterContext.HttpContext.Response.Write("返回Result之后" + Message + "<br />");
  27. }
  28. }

效果:

问:如何注册到全局?

答案就在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. }

三、其他Fileter
1.AcceptVerbs      规定页面的访问形式,如

  1. [AcceptVerbs(HttpVerbs.Post)]
  2. public ActionResult Example(){
  3. return View();
  4. }

2.ActionName     如果不想用方法名做为Action名,或Action名为关键字的话,如

  1. [ActionName("class")]
  2. public ActionResult Example(){
  3. return View();
  4. }

3.NonAction     当前方法仅是普通方法不解析为Action

4.为Action添加缓存

  1. [OutputCache(Duration = 60, VaryByParam = "*")]
  2. public ActionResult Example()
  3. {
  4. return View();
  5. }

5.Action可以接受Html等危险代码(ASP.NET MVC在aspx中设置<%@ Page 的属性无法完成等同任务。)

  1. [ValidateInput(false)]
  2. public ActionResult Example()
  3. {
  4. return View();
  5. }

文章转载:https://www.cnblogs.com/zhangxiaoyong/p/6906288.html#autoid-0-0-0

.net mvc 权限验证 Filter(过滤器)的更多相关文章

  1. NET MVC权限验证

    ASP.NET MVC权限验证 封装类 写该权限类主要目地 为了让权限配置更加的灵活,可以根据SQL.json.或者XML的方式来动态进行页面的访问控制,以及没有权限的相关跳转. 使用步骤 1.要建一 ...

  2. 关于filter web api mvc 权限验证 这里说的够详细了。。。

    参考:http://www.cnblogs.com/willick/p/3331520.html Filter(筛选器)是基于AOP(面向方面编程)的设计,它的作用是对MVC框架处理客户端请求注入额外 ...

  3. MVC权限验证过滤器

    Action属性,权限设定属性   [AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = false)] ...

  4. C# MVC权限验证

    前言 之前一直没怎么接触过权限验证这块,刚好公司老平台改版,就有了这篇权限验证.此篇文章大致讲解下 精确到按钮级别的验证如何实现.以及权限验证设计的参考思路(菜鸟一枚,大神勿喷). 在开发大项目的时候 ...

  5. ASP.NET MVC权限验证 封装类

    写该权限类主要目地 为了让权限配置更加的灵活,可以根据SQL.json.或者XML的方式来动态进行页面的访问控制,以及没有权限的相关跳转. 使用步骤 1.要建一个全局过滤器 //受权过滤器 publi ...

  6. .net web mvc 权限验证

    这里分享MVC的权限验证,内容中可能存在一些,莫名其妙的方法,那些是以前封装好的,大致可以根据方法名称知道他的意思. using Game.Entity; using Game.Entity.Plat ...

  7. mvc 权限验证

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

  8. mvc权限验证--AuthorizeAttribute

    在做后台管理时用户登录后就需要验证哪些权限了,没有登录的就直接退出到登录页面. 系统有自带的权限[Authorize],可用于几个地方: 1.将属性[Authorize]置于相关的action上方,验 ...

  9. MVC权限验证之ActionFilterAttribute

    参考:http://www.cnblogs.com/waitingfor/archive/2011/12/27/2303784.html ActionFilterAttribute是Action过滤类 ...

  10. Asp.net MVC 权限验证,以及是否允许匿名访问

    public class CheckUserAttribute : ActionFilterAttribute, IAuthorizationFilter { public void OnAuthor ...

随机推荐

  1. 私藏!资深数据专家SQL效率优化技巧 ⛵

    作者:韩信子@ShowMeAI 数据分析实战系列:https://www.showmeai.tech/tutorials/40 本文地址:https://www.showmeai.tech/artic ...

  2. python操作MySQL数据库连接(pymysql)

    目录 一:python操作MySQL 1.python如何操作MySQL? 2.什么是 PyMySQL? 二:PyMySQL 安装 1.方法一: 2.方法二: 三:pyMySQL模块基本使用 1.py ...

  3. uniapp微信小程序 原生底部导航栏

    在pages.json文件中写  "tabBar": { "color": "#333333", "selectedColor&q ...

  4. STL list容器API

    list容器:链表容器,不支持随机遍历.不能用通用的sort算法(要有随机访问迭代器),容器自己有排序算法 #define _CRT_SECURE_NO_WARNINGS #include<io ...

  5. [编程基础] C#自定义类调用窗体控件

    如果自定义类需要调用窗体控件,首先需要将窗体控件的可见级别(Modifiers)设为public.如下图所示: 然后在Form1类下定义静态变量form1,并初始化. class Form1: For ...

  6. JAVA中使用最广泛的本地缓存?Ehcache的自信从何而来 —— 感受来自Ehcache的强大实力

    大家好,又见面了. 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面.如果感兴趣,欢迎关注以获取后续更新. 作为<深入理解缓存原理与实战设计 ...

  7. python之路35 MySQL 3 字段的约束条件 外键关系

    字段约束条件 无符号.零填充 unsigned id int unsigned zerofill id int(5) zerofill 非空 create table t1( id int, name ...

  8. C++ 使用 new 创建二维数组

    1. 直接创建 C++ 使用 new 创建二维数组最直接的方法就是 new T[M][N].返回的指针类型是 T (*)[N],它是指向数组的指针,可以直接使用数组下标形式访问元素.释放内存直接使用d ...

  9. 【随笔】Ubuntu18.04下virtualbox卡死的解决办法

    //得到该进程ID X pgrep Xorg //杀掉进程 kill X 然后重新登陆帐号即可

  10. Kafka初学习

    Kafka初学习   摘要:在之前的消息队列学习中,我已经了解了消息队列的基本概念以及基本用法,同时也了解到了市面上的几款消息队列中间件,其中我了解到了卡夫卡这款消息队列中间件是一款最为快速的消息队列 ...