前几天面试遇到这个问题,发现不是很了解,学习了下,这里记录下来

经常需要将用户的操作记录到日志中,或者是验证用户是否登录了网站,

面对这样的需求,以前的操作是自定义一个统一的全局方法,然后做处理,

在每个需要的页面中添加想要的函数调用,这导致了多个页面中存在了大

量重复的代码,这样的方式不太符合软件工程的思想。为了解决这个问题,

mvc为我们提供了过滤器来完成对应的功能,通过过滤器,我们只需要将

相应的业务处理代码写一次,再在相应的功能处通过特性的方式来使用写

好的过滤器。

一句话,我们可以用过滤器来分离与业务逻辑无关却经常需要执行的代码,

既保证业务逻辑的正确性,也保证了代码的简洁直观

先看一段示例:

public class Log : FilterAttribute, IActionFilter
{
public void OnActionExecuted(ActionExecutedContext filterContext)
{
Console.WriteLine("log-after");
//throw new NotImplementedException();
} public void OnActionExecuting(ActionExecutingContext filterContext)
{
Console.WriteLine("log-before");
//throw new NotImplementedException();
}
} public class Exc : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
Console.WriteLine("err");
filterContext.ExceptionHandled = true;
//throw new NotImplementedException();
}
} public class HomeController : Controller
{
// GET: Home
[Log]
[Exc]
public ActionResult Index()
{
throw new Exception("error");
//return View();
}
}

这里我们自定义了一个用来处理异常的类和一个日志记录的类,

然后通过特性的方式将其添加到控制器中需要的地方,这样的代码就变得十分简洁了

那我们可以使用哪些过滤器呢,这里一共有四种过滤器,解释如下

  1. ActionFilter(方法过滤器):接口名为[IActionFilter],在控制器方法调用前/后执行
  2. ResultFilter(结果过滤器):接口名为[IResultFilter],在控制器方法调用完,跳转至view页面前/后执行
  3. AuthorizationFilter(授权过滤器):接口名为[IauthorizationFilter],所有过滤器中最先执行的
  4. ExceptionFilter(异常处理过滤器):接口名为[IExceptionFilter],在控制器方法抛出异常时执行

根据这里的执行顺序,我们可以在不同的需求下自行实现对应的控制器,

需要注意的是,除了我们需要实现对应的过滤器接口外,同时还需要保证对应的过滤器是特性类,

这里我们可以通过继承FilterAttribute类来实现。

接口内部方法解释

IExceptionFilter:OnException,发生异常时调用

IResultFilter:OnResultExecuted,控制器方法执行完调用VIEW页面后执行

       OnResultExecutint,控制器方法执行完调用VIEW页面前执行

IAuthorizationFilter:OnAuthorization,最先调用

IActionFilter:OnActionExecuted,控制器方法执行后执行

       OnActionExecutint,控制器方法执行前执行

记录下来,留待后查

2017 11.30 21:29

asp.net mvc 三种过滤器的更多相关文章

  1. 七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理

    第三天我们将学习Asp.Net中数据处理功能,了解数据访问层,EF,以及EF中常用的代码实现方式,创建数据访问层和数据入口,处理Post数据,以及数据验证等功能. 系列文章 七天学会ASP.NET M ...

  2. 通过源码了解ASP.NET MVC 几种Filter的执行过程 在Winform中菜单动态添加“最近使用文件”

    通过源码了解ASP.NET MVC 几种Filter的执行过程   一.前言 之前也阅读过MVC的源码,并了解过各个模块的运行原理和执行过程,但都没有形成文章(所以也忘得特别快),总感觉分析源码是大神 ...

  3. 七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理 【转】

    http://www.cnblogs.com/powertoolsteam/p/MVC_three.html 第三天我们将学习Asp.Net中数据处理功能,了解数据访问层,EF,以及EF中常用的代码实 ...

  4. Asp.Net MVC<五>:过滤器

    ControllerActionInvoker在执行过程中除了利用ActionDescriptor完成对目标Action方法本身的执行外,还会执行相关过滤器(Filter).过滤器采用AOP的设计,它 ...

  5. 了解ASP.NET MVC几种ActionResult的本质:JavaScriptResult & JsonResult

    在之前的两篇文章(<EmptyResult & ContentResult>和<FileResult>)我们剖析了EmptyResult.ContentResult和F ...

  6. ASP.NET的三种开发模式

    前言 ASP.NET 是一个免费的Web开发框架,是由微软在.NET Framework框架中所提供的,或者说ASP.NET是开发Web应用程序的类库,封装在System.Web.dll 文件中.AS ...

  7. ASP.NET MVC学习之过滤器篇(2)

    下面我们继续之前的ASP.NET MVC学习之过滤器篇(1)进行学习. 3.动作过滤器 顾名思义,这个过滤器就是在动作方法调用前与调用后响应的.我们可以在调用前更改实际调用的动作,也可以在动作调用完成 ...

  8. ASP.NET提供三种主要形式的缓存

    ASP.NET提供三种主要形式的缓存:页面级输出缓存.用户控件级输出缓存(或称为片段缓存)和缓存API.

  9. asp.net MVC之 自定义过滤器(Filter) - shuaixf

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

随机推荐

  1. 第一次使用Open Live Writer维护BlogJava

    换了电脑,又重装了一堆东西,现在才把Open Live Writer整好.顺便记下几个心得: Open Live Writer已经没办法从网站上下载了,介绍个方法,可以把地址直接拷贝到迅雷里面,然后请 ...

  2. jvisualVM的使用

    jvisualvm能干什么:监控内存泄露,跟踪垃圾回收,执行时内存.cpu分析,线程分析... jvisualvm已经被集成在jdk1.6以上的版本中(不是jre).自身运行需要最低jdk1.6版本, ...

  3. Yahoo团队网站性能优化的35条黄金守则

    转载 Excetional Performance 团队总结出了一系列可以提高网站速度的方法.可以分为 7大类 35条.包括内容 .服务器 . CSS . JavaScript .Cookie .图片 ...

  4. Shiro+JWT+Spring Boot Restful简易教程

    序言 我也是半路出家的人,如果大家有什么好的意见或批评,请务必issue下. 项目地址:https://github.com/Smith-Cruise/Spring-Boot-Shiro . 如果想要 ...

  5. [转]Oracle 清除incident和trace -- ADRCI用法

    在oracle11g中,dump file的目录已经有所改变,bdump和udump整合到trace中,cdump独立出一个. E:\ora11g\app\Administrator\diag\rdb ...

  6. P2370 yyy2015c01的U盘(二分+背包)

    思路:先说一下题意吧.就是给你n个文件大小为v,价值为c, 但是硬盘的大小为S, 而且要存的总价值大于等于p.问每次传输k大小的文件.问k的最大值是多少? 我们以k为二分对象. 直接讲检验函数吧. 假 ...

  7. jsonp跨域实现单点登录,跨域传递用户信息以及保存cookie注意事项

    网站A:代码:网站a的login.html页面刷新,使用jsonp方式将信息传递给b.com的login.php中去,只需要在b.com中设置一下跨域以及接收参数,然后存到cookei即可, 注意:网 ...

  8. ESP8266开发综合篇第一节(LUA)-下载和刷固件

    本节视频:  https://v.youku.com/v_show/id_XNDAwMTI2OTg2MA==.html?spm=a2h3j.8428770.3416059.1 一,整版测试 刷入测试固 ...

  9. 【thinkPHP框架】Failed opening required 'header.php' include_path='.;c:\php5\pear 终级解决方案

    ThinkPHP框架中的某一个php页面,想要去引入其他php页面,结果反复报错,无解. 各种百度,有说是文件权限不够的,也有说配置不对的,反正一个都没有解决这个问题,依然无解. 最终,找到了办法,似 ...

  10. IntelliJ IDEA(四) :Settings(上)

    前言 IDEA是一个智能开发工具,每个开发者的使用习惯不同,如何个性化自己的IDEA?我们可以通过Settings功能来设置.Settings文件是IDEA的配置文件,通过他可以设置主题,项目,插件, ...