.NET MVC 过滤器使用
来看以下两种情况
1. 如果我们需要对某个模块做权限控制,通常的做法是写一个基类(BaseController),让这个基类继承Controller类,在BaseController的构造方法中进行权限校验的操作,然后让需要进行校验的类继承 BaseController
2. 如果我们需要自定义错误异常处理,固然我们可以对可能出错的地方都写上 try catch ,但是这几乎不可能实现,因为很多错误我们自己也无法预知
在.net MVC中给我们提供了一种解决方案,那就是过滤器
.net framework给我们提供了四种不同类型过滤器
| 过滤器类型 | 实现接口 | 默认实现 | 重写方法 | 描述 |
| Authorization | IAuthorizationFilter | AuthorizeAttribute | OnAuthorization | 在方法和所有过滤器前执行 |
| Action | IActionFilter | ActionFilterAttribute |
OnActionExecuting OnActionExecuted |
方法执行之前和之后 |
| Result | IResultFilter | ActionFilterAttribute |
OnResultExecuted OnResultExecuting |
结果执行之前和之后 |
| Exception | IExceptionFilter | HandleErrorAttribute | OnException | 抛出异常时执行 |
过滤器两种定义方式:
1. 单独建立一个过滤器类,然后在需要使用该过滤器的方法或者类前面使用特征的方式加上该过滤器,或者使用全局注册的方式 (推荐)
权限校验:
public class MyAuthorization:AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
//RouteData 获取路由数据
List<KeyValuePair<string, object>> router_data = filterContext.RouteData.Values.ToList(); //在这里进行权限判断,如果具备权限,则跳转到错误页面
filterContext.HttpContext.Response.Write("检查权限"); //跳转到 Auth 控制器下 Login 方法
filterContext.Result = new RedirectResult("Auth/Login"); //这种跳转方法不会终止程序执行
//filterContext.HttpContext.Response.Redirect("Auth/Login") //注释掉此行代码,否则将执行系统定义的过滤器
//base.OnAuthorization(filterContext);
}
//在需要进行权限校验的方法或者类前面加上该过滤器
[MyAuthorization]
public ActionResult Index()
{
return View();
}
异常处理:
public override void OnException(ExceptionContext filterContext)
{
//日志记录,然后跳转到错误页
filterContext.Result = new RedirectResult("/error/400.html"); //这行代码不可以被删除 否则捕捉不到异常
base.OnException(filterContext);
}
然后在 App_Start/FilterConfig.cs 中全局注册
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//注释掉系统注册的全局异常处理
//filters.Add(new HandleErrorAttribute()); filters.Add(new MyException());
}
最后需要在根目录 web.config中开启自定义异常处理
//在 system.web 节点中添加 <customErrors mode="On">
</customErrors>
2. 在控制器中重写对应方法,然后改控制器下所有方法都会自动使用该控制器
protected override void OnAuthorization(AuthorizationContext filterContext)
{
filterContext.HttpContext.Response.Write("这是控制器中重写的方法");
}
.NET MVC 过滤器使用的更多相关文章
- mvc过滤器学习(1)
mvc 过滤器结构图 AuthorizeAttribute AuthorizeAttribute是IAuthorizationFilter的默认实现,添加了Authorize特性的Action将对用户 ...
- ASP.NET MVC 过滤器(一)
ASP.NET MVC 过滤器(一) 前言 前面的篇幅中,了解到了控制器的生成的过程以及在生成的过程中的各种注入点,按照常理来说篇幅应该到了讲解控制器内部的执行过程以及模型绑定.验证这些知识了.但是呢 ...
- ASP.NET MVC 过滤器(三)
ASP.NET MVC 过滤器(三) 前言 本篇讲解行为过滤器的执行过程,过滤器实现.使用方式有AOP的意思,可以通过学习了解过滤器在框架中的执行过程从而获得一些AOP方面的知识(在顺序执行的过程中, ...
- ASP.NET MVC 过滤器(四)
ASP.NET MVC 过滤器(四) 前言 前一篇对IActionFilter方法执行过滤器在框架中的执行过程做了大概的描述,本篇将会对IActionFilter类型的过滤器使用来做一些介绍. ASP ...
- ASP.NET MVC 过滤器(五)
ASP.NET MVC 过滤器(五) 前言 上篇对了行为过滤器的使用做了讲解,如果在控制器行为的执行中遇到了异常怎么办呢?没关系,还好框架给我们提供了异常过滤器,在本篇中将会对异常过滤器的使用做一个大 ...
- asp.net MVC 过滤器使用案例:统一处理异常顺道精简代码
重构的乐趣在于精简代码,模块化设计,解耦功能……而对异常处理的重构则刚好满足上述三个方面,下面是我的一点小心得. 一.相关的学习 在文章<精简自己20%的代码>中,讨论了异常的统一处理,并 ...
- MVC过滤器详解
MVC过滤器详解 APS.NET MVC中(以下简称"MVC")的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理. ...
- MVC过滤器使用案例:统一处理异常顺道精简代码
重构的乐趣在于精简代码,模块化设计,解耦功能……而对异常处理的重构则刚好满足上述三个方面,下面是我的一点小心得. 一.相关的学习 在文章<精简自己20%的代码>中,讨论了异常的统一处理,并 ...
- ASP.NET MVC 过滤器详解
http://www.fwqtg.net/asp-net-mvc-%E8%BF%87%E6%BB%A4%E5%99%A8%E8%AF%A6%E8%A7%A3.html 我经历了过滤器的苦难,我想到了还 ...
- ASP.NET MVC过滤器(一)
MVC过滤器是加在 Controller 或 Action 上的一种 Attribute,通过过滤器,MVC 网站在处理用户请求时,可以处理一些附加的操作,如:用户权限验证.系统日志.异常处理.缓存等 ...
随机推荐
- LSTM学习—Long Short Term Memory networks
原文链接:https://colah.github.io/posts/2015-08-Understanding-LSTMs/ Understanding LSTM Networks Recurren ...
- JavaScript之Math
1. Math Math是js的内置函数,无需创建,把Math作为对象使用就可以调用其属性和方法. 2.Date 2.1 日期对象创建 var now = new Date ( ); 含参数时表 ...
- C#磁性窗体设计
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- 北大poj- 1006
生理周期 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 133189 Accepted: 42577 Descripti ...
- FCC JS基础算法题(0):Reverse a String(翻转字符串)
题目描述: 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串.你的结果必须得是一个字符串. 算法: function reverseString(str) { ...
- SQLite相关异常
SQLite的异常大多都和异常IO操作有关,这类异常通常在debug测试的时候难以发现通常和用户的操作有关系,根据我遇到的包括以下几种: 1.No transaction is active 这种情况 ...
- Python 测试多进程的时间
import time from multiprocessing import Process def f1(): time.sleep(2) print("子进程1号") def ...
- Python学习之路基础篇--02Python基础+小作业
1 变量 变量就是将一些运算的中间结果暂存到内存中,以便后续代码调用.必须由数字,字母,下划线任意组合,且不能数字开头.不能是python中的关键字,如['and', 'as', 'assert', ...
- A Language Modeling Approach to Predicting Reading Difficulty-paer
Volume:Proceedings of the Human Language Technology Conference of the North American Chapter of the ...
- 网络编程-----IO
IO模型介绍 阻塞IO 非阻塞 多路复用 异步 IO模型比较分析 selectors 阻塞IO:之前写的所有的socket,recv,accput都是 阻塞原理: 其实多数时间多用到了等待数据那里. ...