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过滤器的详细讲解和示范样本的更多相关文章

  1. Spring MVC详细讲解

    一:三层架构和MVC 1:三层架构 我们的开发架构一般都是基于两种形式:一种是 C/S 架构,也就是客户端/服务器,另一种是 B/S 架构,也就是浏览器服务器.在 JavaEE 开发中,几乎全都是基于 ...

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

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

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

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

  4. 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 我经历了过滤器的苦难,我想到了还 ...

  5. MVC 过滤器1

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

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

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

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

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

  8. MVC过滤器详解

    MVC过滤器详解   APS.NET MVC中(以下简称"MVC")的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理. ...

  9. MVC过滤器使用案例:统一处理异常顺道精简代码

    重构的乐趣在于精简代码,模块化设计,解耦功能……而对异常处理的重构则刚好满足上述三个方面,下面是我的一点小心得. 一.相关的学习 在文章<精简自己20%的代码>中,讨论了异常的统一处理,并 ...

随机推荐

  1. 第二十次codeforces竞技结束 #276 Div 2

    真是状况百出的一次CF啊-- 终于还Unrated了,你让半夜打cf 的我们怎样释怀(中途茫茫多的人都退场了)--虽说打得也不好-- 在这里写一下这一场codeforces的解题报告.A-E的 题目及 ...

  2. 真实世界里的钢铁侠-特斯拉汽车创始人埃隆&#183;马斯克(Elon Musk)

    真实世界里的钢铁侠--特斯拉汽车公司和SpaceX公司总裁马斯克(31岁).当我们得意于「站在山上踢几块石头下去」或是「站在风口上的猪」的成功理论的时候,我们真的成功了吗?我们到底创造了什么?改变了什 ...

  3. 开发测试时给 Kafka 发消息的 UI 发送器――Mikasa

    开发测试时给 Kafka 发消息的 UI 发送器――Mikasa 说来话长,自从入了花瓣,整个人就掉进连环坑了. 后端元数据采集是用 Storm 来走拓扑流程的,又因为 @Zola 不是很喜欢 Jav ...

  4. Ubuntu 12.04更新源

    源地址:http://www.cnblogs.com/eastson/archive/2012/08/24/2654163.html 1.首先备份Ubuntu12.04源列表 sudo cp /etc ...

  5. selenium webdriver缺陷

    关闭  selenium webdriver缺陷 除了http://573301735.com/?p=5126讲 的,昨天又发现一个让我1个小时生不如死的问题,就是使用两个不同的配置文件来初始化dri ...

  6. CCLuaObjcBridge调Objective-C方法传索引数组报invalid key to &#39;next&#39;错调试

    CCLuaObjcBridge是cocos2d-x系列引擎与Objective-C进行交互的"桥梁",老廖的quick-cocos2d-x在其framework进行了简单了封装,封 ...

  7. android动画-动画分类及代码演示样例

    原来一直对动画一知半解,仅仅知道依照网上的方法会用即可了,可是自己写起来感觉确实有点费劲,今天最终研究了代码实现,一下子感觉清晰多了.先把总结例如以下,代码中有具体的凝视. 动画分类 1.Peoper ...

  8. (017)将一棵二叉查找树重构成链表(keep it up)

    给定一棵二叉查找树,设计算法,将每一层的全部结点构建为一个 链表(也就是说, 假设树有D层,那么你将构建出D个链表). 这个题实质是个BFS,可是实现起来有点麻烦,又不像常见的BFS, 所以编写代码时 ...

  9. Xcode6在10.9.4上面crash解决

    具体请看我的evernote 这里: 在10.9.4系统上面直接安装xcode6的beta3.和平时一样, 1.将beta3拖拽到application文件夹中. 2.等待copy完毕,执行xcode ...

  10. Ubuntu12.10 下搭建基于KVM-QEMU的虚拟机环境(十三)

    今天我们实验libvirt提供的快照功能,快照可以用于系统恢复,防止安装了某些软件或中病毒等情况导致系统损毁的情况. 一.快照类型 1)        磁盘快照 内部的:快照驻留在原来的镜像文件内部 ...