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. [翻译]利用C#获取终端服务(Terminal Services)会话的闲置时间

    [翻译]利用C#获取终端服务(Terminal Services)会话的闲置时间 作者:Tuuzed(土仔)   发表于:2008年2月29日版权声明:可以任意转载,转载时请务必以超链接形式标明文章原 ...

  2. [Android学习笔记]双缓冲绘图技术

    双缓冲技术绘图: 什么情况下产生的双缓冲技术?当数据量很大时,绘图可能需要花费很长的时间,这样屏幕就会出现卡顿,闪烁等现象. 什么是双缓冲技术?双缓冲是在内存中创建一个与屏幕绘制区域一致的对象,先将图 ...

  3. HDU 3571 N-dimensional Sphere(高斯消元 数论题)

    这道题算是比较综合的了,要用到扩展欧几里得,乘法二分,高斯消元. 看了题解才做出来orz 基本思路是这样,建一个n*(n-1)的行列式,然后高斯消元. 关键就是在建行列式时会暴long long,所以 ...

  4. vc 基于对话框多线程编程实例——线程之间的通信

     vc基于对话框多线程编程实例——线程之间的通信 实例:

  5. Linux Shell脚本编程--curl命令详解

    用途说明 curl命令是一个功能强大的网络工具,它能够通过http.ftp等方式下载文件,也能够上传文件.其实curl远不止前面所说的那些功能,大家可以通过man curl阅读手册页获取更多的信息.类 ...

  6. Cocos2dx3.4 VS2013无法打开包括文件extensions/ExtensionExport.h解决的方法

    本来打算看白鹭引擎的.可是又被叫回来研究新引擎呢,不搞不知道,一搞发现cocos2dx新版本号3.4又有了一些变化. 我查了网上的资源,都没有解决的方法.我如今应该是第一个出这个问题的解决的方法哦.. ...

  7. android之listView定位到指定行同一时候隐藏输入键盘

    帮别人该bug遇到的一个问题,记录下来. listView.setSelection(a); 这种方法能够让让你的listview定位到指定行 可是假设紧接着运行隐藏输入键盘的代码.则会有bug.这个 ...

  8. B. 沙漠之旅(分组背包)

    B. 沙漠之旅 Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: % ...

  9. hdu2606(递推)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2606 题意:  用1*1,2*2,3*3,4*4的正方形填充4*n的矩形, 问有多少种不同填法. 分析 ...

  10. hdu3899(树形dp)

    题意:给一树,每个结点有人数,边有权值,表示经过这条边所需时间, 问取某个结点作为开会地点,所有人全部到达此结点最少所需总时间? 分析:val[u]表示以u为根节点的总人数,num[u]表示以u为根节 ...