MVC过滤器的详细讲解和示范样本
MVC共有4个过滤器:ActionFilter(方法过滤器),ResultFilter(结果过滤器。感觉是不是很好,所以称它为),AuthorizationFilter(授权过滤器)。ExceptionFilter(异常处理过滤器)
| 过滤器类型 | 接口 | 默认实现 | 描写叙述 |
| Action | IActionFilter | ActionFilterAttribute | 在动作方法之前及之后执行 |
| Result | IResultFilter | ActionFilterAttribute | 在动作结果被执行之前和之后执行 |
| AuthorizationFilter | IAuthorizationFilter | AuthorizeAttribute | 首先执行,在不论什么其他过滤器动作方法之前执行 |
| Exception | IExceptionFilter | HandleErrorAttribute | 仅仅在另外一个过滤器,动作方法,动作结果弹出异常时执行 |
演示样例:Action方法过滤器
/// <summary>
/// Action方法 过滤器 类
/// </summary>
public class MyActionFilterAttribute : ActionFilterAttribute
{
/// <summary>
/// 在 Action方法之前 调用
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//1. RouteData 中 保存了 当前请求 匹配的 路由信息和路由对象
// 假设本次请求 是请求了某个 区域 里的 控制器方法,还能够通过filterContext.RouteData.DataTokens["area"]获取区域名 //string strArea = filterContext.RouteData.DataTokens["area"].ToString();
string strController = filterContext.RouteData.Values["controller"].ToString();
string strAction = filterContext.RouteData.Values["action"].ToString();
//filterContext.RouteData.GetRequiredString //2.还有一种方式 获取 请求的 类名和方法名
string strAction2 = filterContext.ActionDescriptor.ActionName;
string strController2 = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName; //2.1检查 被请求方法 是否 加了 MoneyAttribute 特性
if (filterContext.ActionDescriptor.IsDefined(typeof(Filters.MoneyAttribute), false))
{
//直接为 请求 设置 返回结果。而不运行 相应的 Action 方法,也不运行 OnActionExcuted,可是。会运行 Result过滤器和 生成视图
filterContext.Result = new ContentResult() { Content = "<br/>哈哈哈。直接被跳过了吧~~~!<br/>" };
} filterContext.HttpContext.Response.Write("哇哈哈哈~!OnActionExecuting<br/>");
base.OnActionExecuting(filterContext);
} /// <summary>
/// 在 Action方法之后 调用
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("哇哈哈哈~。OnActionExecuted<br/>");
base.OnActionExecuted(filterContext);
}
用法1:将过滤器加到方法上
[Filters.MyActionFilter]//1.将 过滤器 加到方法上
[Filters.Money]
[Filters.MyResultFilter]
[Filters.MyAuthorize]
public ActionResult Index()
{
Response.Write("Index 方法<br/>");
ViewBag.name = "时间:" + DateTime.Now;
return View();
}
用法2:将过滤器加到方类上
[Filters.MyActionFilter]
public class HomeController : Controller
{
}
用法3:加入全局过滤器,即加入到FilterConfig.cs中
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute()); //3. 加入全局过滤器
filters.Add(new Filters.MyActionFilterAttribute()); filters.Add(new Filters.MyHandleErrorAttribute());
}
}
演示样例:Result过滤器
/// <summary>
/// Result 过滤器 类 - 假设请求的是 要载入视图的 Action 方法的话
/// 在 视图载入 前 后 调用方法
/// </summary>
public class MyResultFilterAttribute:System.Web.Mvc.ActionFilterAttribute
{
/// <summary>
/// 载入 "视图" 前运行
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuting(System.Web.Mvc.ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("载入 视图 前运行 OnResultExecuting <br/>");
base.OnResultExecuting(filterContext);
} /// <summary>
/// 载入"视图" 后运行
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuted(System.Web.Mvc.ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("载入 视图 后运行 OnResultExecuted <br/>");
base.OnResultExecuted(filterContext);
}
}
演示样例:授权过滤器 - 在 Action过滤器前 运行
/// <summary>
/// 授权过滤器 - 在 Action过滤器前 运行
/// </summary>
public class MyAuthorizeAttribute:AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
filterContext.HttpContext.Response.Write("<br/>OnAuthorization<br/>");
//凝视掉 父类方法,由于 父类里的 OnAuthorization 方法会 调用 asp.net的授权验证机制!
//base.OnAuthorization(filterContext);
}
}
演示样例:Exception过滤器
/// <summary>
/// 异常处理 过滤器
/// </summary>
public class MyHandleErrorAttribute : HandleErrorAttribute
{
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);
}
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
MVC过滤器的详细讲解和示范样本的更多相关文章
- Spring MVC详细讲解
一:三层架构和MVC 1:三层架构 我们的开发架构一般都是基于两种形式:一种是 C/S 架构,也就是客户端/服务器,另一种是 B/S 架构,也就是浏览器服务器.在 JavaEE 开发中,几乎全都是基于 ...
- ASP.NET MVC 过滤器(一)
ASP.NET MVC 过滤器(一) 前言 前面的篇幅中,了解到了控制器的生成的过程以及在生成的过程中的各种注入点,按照常理来说篇幅应该到了讲解控制器内部的执行过程以及模型绑定.验证这些知识了.但是呢 ...
- ASP.NET MVC 过滤器(五)
ASP.NET MVC 过滤器(五) 前言 上篇对了行为过滤器的使用做了讲解,如果在控制器行为的执行中遇到了异常怎么办呢?没关系,还好框架给我们提供了异常过滤器,在本篇中将会对异常过滤器的使用做一个大 ...
- 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 我经历了过滤器的苦难,我想到了还 ...
- MVC 过滤器1
ASP.NET MVC 过滤器(一) 前言 前面的篇幅中,了解到了控制器的生成的过程以及在生成的过程中的各种注入点,按照常理来说篇幅应该到了讲解控制器内部的执行过程以及模型绑定.验证这些知识了.但是呢 ...
- ASP.NET MVC 过滤器(三)
ASP.NET MVC 过滤器(三) 前言 本篇讲解行为过滤器的执行过程,过滤器实现.使用方式有AOP的意思,可以通过学习了解过滤器在框架中的执行过程从而获得一些AOP方面的知识(在顺序执行的过程中, ...
- ASP.NET MVC 过滤器(四)
ASP.NET MVC 过滤器(四) 前言 前一篇对IActionFilter方法执行过滤器在框架中的执行过程做了大概的描述,本篇将会对IActionFilter类型的过滤器使用来做一些介绍. ASP ...
- MVC过滤器详解
MVC过滤器详解 APS.NET MVC中(以下简称"MVC")的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理. ...
- MVC过滤器使用案例:统一处理异常顺道精简代码
重构的乐趣在于精简代码,模块化设计,解耦功能……而对异常处理的重构则刚好满足上述三个方面,下面是我的一点小心得. 一.相关的学习 在文章<精简自己20%的代码>中,讨论了异常的统一处理,并 ...
随机推荐
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- ORA-00376:file x cannot be read at this time
之前出现过机房断电情况,重启数据库后发现出现ORA-00376的错误. 通过查询数据文件状态: SQL> select file_id,online_status from dba_data_f ...
- 数字雨Shopex 4.8.5 SQL Injection Exp
# -*- coding:utf-8 -* #Author:MXi4oyu #Email:798033502@qq.com #Shopex 4.8.5 SQL Injection Exp #转载请说明 ...
- 移动App測试实战:顶级互联网企业软件測试和质量提升最佳实践
这篇是计算机类的优质预售推荐>>>><移动App測试实战:顶级互联网企业软件測试和质量提升最佳实践> 国内顶级互联网公司測试实战经验总结.阿里.腾讯.京东.携程.百 ...
- 改动file header (測)
--改动file header ------------------------------------------------------------------------- cd $ORACLE ...
- hdu 5056Boring count
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5056 题目大意:就是问在子串中每一个小写字母出现次数不超过k次的个数,注意子串是连续的子串.. . ...
- python 入门学习---模块导入三种方式及中文凝视
Python 有三种模块导入函数 1. 使用import 导入模块 import modname : 模块是指一个能够交互使用,或者从还有一Python 程序訪问的代码段.仅仅要导入了一个模块,就能够 ...
- poj2253(最短路小变形)
题目连接:http://poj.org/problem?id=2253 题意:给出一个无向图,求一条1~2的路径使得路径上的最大边权最小. 分析:dij将距离更新改成取最大值即可,即dp[i]表示到达 ...
- cocos2d-x博客网站推荐和牛逼的教程
Cocos2d-x网站列表 CocoaChina(官方网站,不解释)www.cocoachina.com/ 泰然网(貌似最近有很多不错的文章,不过早期的文章质量一般)www.ityran.com/ C ...
- shell 脚本之if、for、while语句
(1)if语句 root@ubuntu:/mnt/shared/shellbox/shellif# cat shellif.sh #!/bin/bash #推断字符串 if [ "$1&qu ...