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

过滤器类型

类型 接口 默认实现 执行时间 描述
 Action  IActionFilter ActionFilterAttribute  用于进入行为之前或之后的处理  方法过滤器
 Result  IResultFilter ActionFilterAttribute 用于返回结果的之前或之后的处理  结果过滤器
 Exception  IExceptionFilter

HandleErrorAttribute

用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常  异常过滤器
 Authentication  IAuthorizationFilter

AuthorizeAttribute

此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法  授权过滤器

1. Action

  • 在ASP.NET MVC项目中新建文件夹Filter,然后再在文件夹下新建类MyActionFilter,在类中添加命名空间using System.Web.Mvc,再继承自ActionFilterAttribute抽象类,我们按F12我们可以看到抽象类有四个方法,从方法的命名我们不难发现他们的执行顺序。
    public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter
{
protected ActionFilterAttribute();
public virtual void OnActionExecuted(ActionExecutedContext filterContext);
public virtual void OnActionExecuting(ActionExecutingContext filterContext);
public virtual void OnResultExecuted(ResultExecutedContext filterContext);
public virtual void OnResultExecuting(ResultExecutingContext filterContext);
}

MyActionFilter.cs

    public class MyActionFilter : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("在Action执行后执行");
base.OnActionExecuted(filterContext);
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("在Action执行前执行");
base.OnActionExecuting(filterContext);
}
}
  • 过滤器可以加在三个地方,第一是控制器上面(可限制控制器下面所有的Action),第二是Action上面(限制指定的Action),第三是全局的过滤器(限制所有的Action)。

  1. 控制器上面  

2.  Action上面

3.   全局过滤器

在ASP.NET MVC项目中的App_Start下新建类FilterConfig,添加静态方法RegisterGlobalFilters。

在Global中注册RegisterGlobalFilters方法。

  • 运行结果

2. Result

  • Result作用于用于返回视图的之前或之后的处理。

代码如下:

        //加载试图后执行
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("加载视图后执行OnResultExecuted<br/>");
base.OnResultExecuted(filterContext);
}
//加载试图前执行
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("加载视图前执行OnResultExecuting<br/>");
base.OnResultExecuting(filterContext);
}

结果如下:

3. Exception

  • 异常过滤器最好设置成全局过滤器,记录异常日志。

代码如下:

        /// <summary>
/// 异常处理过滤器,最好设置成全局过滤器
/// </summary>
/// <param name="filterContext"></param>
public override void OnException(ExceptionContext filterContext)
{
//1. 获取异常对象
Exception ex = filterContext.Exception;
//2. 记录异常日志
//3. 调整友好页
filterContext.Result = new RedirectResult("~/error.html");
//4. 标记异常已经处理完毕
filterContext.ExceptionHandled = true;
base.OnException(filterContext);
}

4. Authentication

  • 授权过滤器作用范围在Action之前
        public override void OnAuthorization(AuthorizationContext filterContext)
{
filterContext.HttpContext.Response.Write("授权过滤器");
base.OnAuthorization(filterContext);
}

5. 过滤器的执行顺序

ASP.NET MVC过滤器的更多相关文章

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

    ASP.NET MVC 过滤器(一) 前言 前面的篇幅中,了解到了控制器的生成的过程以及在生成的过程中的各种注入点,按照常理来说篇幅应该到了讲解控制器内部的执行过程以及模型绑定.验证这些知识了.但是呢 ...

  2. ASP.NET MVC 过滤器(三)

    ASP.NET MVC 过滤器(三) 前言 本篇讲解行为过滤器的执行过程,过滤器实现.使用方式有AOP的意思,可以通过学习了解过滤器在框架中的执行过程从而获得一些AOP方面的知识(在顺序执行的过程中, ...

  3. ASP.NET MVC 过滤器(四)

    ASP.NET MVC 过滤器(四) 前言 前一篇对IActionFilter方法执行过滤器在框架中的执行过程做了大概的描述,本篇将会对IActionFilter类型的过滤器使用来做一些介绍. ASP ...

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

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

  5. ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)

    上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...

  6. Asp.net Mvc 过滤器执行顺序

    Asp.net Mvc 过滤器执行顺序: IAuthorizationFilter(OnAuthorization)----->IActionFilter(OnActionExecuting)- ...

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

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

  8. ASP.NET MVC 过滤器开发与使用

    ASP.NET MVC 中给我们提供了内置的过滤器,通过过滤器,我们可以在控制器内的方法前后,添加必须的业务逻辑,如权限验证,身份验证,错误处理等. 今天,我们主要介绍3个过滤器:OutputCach ...

  9. Asp.Net MVC过滤器小试牛刀

    在上学期间学习的Asp.Net MVC,基本只是大概马马虎虎的了解,基本处于知其然而不知其所以然.现在到上班,接触到真实的项目,才发现还不够用,于是从最简单的过滤器开始学习.不得不说MVC的过滤器真是 ...

随机推荐

  1. wpf 逻辑树与可视化树

    XAML天生就是用来呈现用户界面的,这是由于它具有层次化的特性.在WPF中,用户界面由一个对象树构建而成,这棵树叫作逻辑树.逻辑树的概念很直观,但是为什么要关注它呢?因为几乎WPF的每一方面(属性.事 ...

  2. 基于腾讯手Q样式规范Frozen UI

    Frozen UI是一个开源的简单易用,轻量快捷的移动端UI框架.基于手Q样式规范,选取最常用的组件,做成公用离线包减少请求,升级方式友好,文档完善,目前全面应用在腾讯手Q增值业务中. css组件包括 ...

  3. ABP理论学习之日志记录

    返回总目录 本篇目录 服务端 获取Logger 基类中的Logger 配置 客户端 服务端 ABP使用的是Castle Windsor的日志记录设备.它可以和不同的日志类库一起工作,比如Log4Net ...

  4. 优秀网站看前端 —— 小米Note介绍页面

    刚开始经营博客的时候,我写过不少“扒皮”系列的文章,主要介绍一些知名站点上有趣的交互效果,然后试着实现它们.后来开始把注意力挪到一些新颖的前端技术上,“扒皮”系列便因此封笔多时.今天打算重开“扒皮”的 ...

  5. 探索c#之跳跃表(SkipList)

    阅读目录: 基本介绍 算法思想 演化步骤 实现细节 总结 基本介绍 SkipList是William Pugh在1990年提出的,它是一种可替代平衡树的数据结构. SkipList在实现上相对比较简单 ...

  6. MyISAM和InnoDB

    MyISAM和InnoDB MyISAM MyISAM使用B+tree作为索引结构,叶节点存放的是数据地址. MyISAM不支持事务和外键. MyISAM是表锁,对数据库写操作时会锁住整个表,效率低. ...

  7. 微冷的雨Java基础学习手记(一)

    使用Java理解程序逻辑 之凌波微步 船舶停靠在港湾是很安全的,但这不是造船的目的 北大青鸟五道口原玉明老师出品 1.学习方法: 01.找一本好书 初始阶段不适合,可以放到第二个阶段,看到知识点时,要 ...

  8. Intellij IDEA 13.1.3 创建Java Web项目

    作者QQ:1095737364 1.  Intellij 编辑工具,找到File-->New Project 2.   打开后点击java-->选中WebApplication 和Java ...

  9. Building third-party products of OpenCascade

    Building third-party products of OpenCascade eryar@163.com Available distributives of third-party pr ...

  10. ViewPager+RadioGroup实现标题栏切换,Fragment切换

    1.说明: 在使用RadioGroup做标题栏切换的时候,跟ViewPager的滑动有冲突,最后查看了源码+断点调试解决了一些碰到的问题,写一篇博客总结一下,有同样需求的朋友可以借鉴一下,自己以后有用 ...