MVC - 16.MVC过滤器
filter
- n. 滤波器;[化工] 过滤器;筛选;滤光器
- vt. 过滤;渗透;用过滤法除去
1.过滤器表
|
过滤器类型 |
接口 |
默认实现 |
描述 |
| Action | IActionFilter | ActionFilterAttribute | 在动作方法之前及之后运行 |
| Result | IResultFilter | ActionFilterAttribute | 在动作结果被执行之前和之后运行 |
| AuthorizationFilter | IAuthorizationFilter | AuthorizeAttribute | 首先运行,在任何其它过滤器或动作方法之前 |
| Exception | IExceptionFilter | HandleErrorAttribute | 只在另一个过滤器、动作方法、动作结果弹出异常时运行 |
2.Action
2.1.创建Action特性
自定义一个ActionFilterAttribute类,使他继承自 ActionFilterAttribute

public class MyActionFilterAttribute : ActionFilterAttribute
{ }

2.2. Action方法 过滤器 类
Filter/MyactionFilterAttribute.cs
Filter/MyactionFilterAttribute.cs /// <summary>
/// Action方法 过滤器 类
/// </summary>
public class MyActionFilterAttribute : ActionFilterAttribute
{
//执行Action方法之前
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("执行Action方法之前 OnActionExecuting<br/>");
base.OnActionExecuting(filterContext);
} //执行Action方法之后
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("执行Action方法之后 OnActionExecuted");
base.OnActionExecuted(filterContext);
}
}
Controller/HomeController.cs
public class HomeController : Controller
{
//
// GET: /Home/
[Filter.MyActionFilter]
public ActionResult Index()
{
Response.Write(" index输出文字判断 <br/>");
return View();
} }
View/Index.cs
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
我是Index页面,

2.3.全局Action特性

public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
//添加全局 MyActionFilterAttribute
filters.Add(new Filter.MyActionFilterAttribute());
}
}
3.Reslut
3.1.Action方法 过滤器 类
Filter/YouResultFilterAtrribute.cs
Filter/YouResultFilterAtrribute.cs using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace _16MVCFilter.Filter
{
/// <summary>
/// Result 过滤器 - 加载的是视图 “Action” 方法的话,在加载视图前后调用
/// </summary>
public class YouResultFilterAtrribute : ActionFilterAttribute
{
/// <summary>
/// 加载“视图”前
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("3.执行 Result “视图” 方法之前 OnActionExecuting<br/>");
base.OnResultExecuting(filterContext);
}
/// <summary>
/// 加载“视图”后
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("4.执行 Result “视图” 方法之后 OnActionExecuting<br/>");
base.OnResultExecuted(filterContext);
}
}
}
3.2.特性使用
Controller/HomeController.cs
[Filter.MyActionFilter]
[Filter.YouResultFilterAtrribute]
public ActionResult Index()
{
Response.Write(" index输出文字判断 <br/>");
return View();
}
3.3.全局Result特性

public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
//添加全局 MyActionFilterAttribute
filters.Add(new Filter.MyActionFilterAttribute());
//添加全局 YOuResultFilterAttribute
filters.Add(new Filter.YouResultFilterAtrribute());
}
}

4.过滤器上下文里RouteData中获取url数据
RouteData
1.获取Action方法名,
2.Controller类名
3.area区域名
//执行Action方法之前
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//action 方法
string strAction = filterContext.RouteData.Values["action"].ToString();
//controller 类名
string strContoller = filterContext.RouteData.Values["controller"].ToString();
//RouteData.DataTokens["area"] 取得区域名称
string areaName = filterContext.RouteData.DataTokens["area"].ToString();
base.OnActionExecuting(filterContext);
}
5.过滤器上下文里的补充-跳过Action方法(重要)
Controller/HomeController.cs
public class HomeController : Controller
{
//
// GET: /Home/
//[Filter.MyActionFilter]
//[Filter.YouResultFilterAtrribute]
[Filter.Hide]
public ActionResult Index()
{
Response.Write(" index输出文字判断 <br/>");
return View();
} }
OnActionExecuting方法
OnActionExecuting方法 public override void OnActionExecuting(ActionExecutingContext filterContext)
{
#region 1.0.RouteData
//action 方法
string strAction = filterContext.RouteData.Values["action"].ToString();
//contoller 类名
string strContoller = filterContext.RouteData.Values["controller"].ToString();
//RouteData.DataTokens["area"] 取得区域名称
//string areaName = filterContext.RouteData.DataTokens["area"].ToString();
//*{controller}/{action}/{id}
string s = ((System.Web.Routing.Route)(filterContext.RouteData.Route)).Url;
#endregion #region 2.0.另外一种获取请求的 类名 和 方法名
string strAction2 = filterContext.ActionDescriptor.ActionName;
string strController2 = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
#endregion #region 2.1.检查被请求的方法 是否加了 Hide 特性(Attribute)
//2.1.检查被请求的方法 是否加了 Hide 特性(Attribute)
if (filterContext.ActionDescriptor.IsDefined(typeof(Filter.Hide), false))
{
//直接为请求 设置 返回结果 而不执行队形的 Action 方法,也不执行 OnActionExcuted,但是会执行 Result过滤器和生成视图
filterContext.Result = new ContentResult() { Content = "<br/>(11).后面直接跳过,!~~<br/>" };
}
#endregion filterContext.HttpContext.Response.Write("(1).执行Action方法之前 OnActionExecuting<br/>");
base.OnActionExecuting(filterContext);
}

看下图,执行后源代码对比,(5)使用hide特性不执行,执行(11),(2)onacgtionExrcuted不执行。

6.AuthorizeAttribute 授权过滤器
6.1.执行的位置

6.2.注释掉base.OnAuthorization,是因为我们不用ASP.NET授权验证,用自己的

MVC - 16.MVC过滤器的更多相关文章
- Asp.Net MVC<五>:过滤器
ControllerActionInvoker在执行过程中除了利用ActionDescriptor完成对目标Action方法本身的执行外,还会执行相关过滤器(Filter).过滤器采用AOP的设计,它 ...
- ASP.NET MVC 4 (三) 过滤器
先来看看一个例子演示过滤器有什么用: public class AdminController : Controller { // ... instance variables and constru ...
- ASP.NET MVC学习之过滤器篇(2)
下面我们继续之前的ASP.NET MVC学习之过滤器篇(1)进行学习. 3.动作过滤器 顾名思义,这个过滤器就是在动作方法调用前与调用后响应的.我们可以在调用前更改实际调用的动作,也可以在动作调用完成 ...
- MVC之 自定义过滤器(Filter)
MVC之 自定义过滤器(Filter) 一.自定义Filter 自定义Filter需要继承ActionFilterAttribute抽象类,重写其中需要的方法,来看下ActionFilterAttri ...
- APS.NET MVC + EF (11)---过滤器
过滤器本质就是对动作方法的执行过程进行干预,这种干预可以影响动作方法执行的各个过程.ASP.NET MVC 提供了4种类型的接口,并在接口中定义了各种成员,代表代码执行的各个阶段,这些接口和成员如表1 ...
- Spring MVC 解读——<mvc:annotation-driven/>(转)
转自:http://my.oschina.net/HeliosFly/blog/205343 Spring MVC 解读——<mvc:annotation-driven/> 一.Annot ...
- [转]MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)
本文转自:http://www.cnblogs.com/landeanfen/p/5989092.html 阅读目录 一.MVC原理解析 1.MVC原理 二.HttpHandler 1.HttpHan ...
- MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)
前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...
- MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)
前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...
随机推荐
- Java序列化技术与Protobuff
http://www.cnblogs.com/fangfan/p/4094175.html http://www.cnblogs.com/fangfan/p/4094175.html 前言: Java ...
- 网络数据包发送工具PacketSender中文源码
在网上发现了一个好用的工具PacketSender,数据包发送器.对于写网络程序来说,有很大的便利性.虽然在linux下,netcat工具也很好用,但是这个也不错. 原本是英文的,给翻译了一下.这是基 ...
- 15 BasicHashTable基本哈希表类(二)——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...
- 【原创】ReFlux细说
ReFlux细说 Flux作为一种应用架构(application architecture)或是设计模式(pattern),阐述的是单向数据流(a unidirectional data flow) ...
- GFF3格式
GFF3是GFF注释文件的新标准.文件中每一行为基因组的一个属性,分为9列,以TAB分开. 依次是: 1. reference sequence:参照序列 指出注释的对象.如一个染色体,克隆或片段.可 ...
- 算法题解之math类题
Bulb Switcher 灯泡开关 思路:除了平方数以外,其他所有位置的灯泡最终都被开关了偶数次,因此最终都为0.问题等价于求1~n中平方数的个数. public class Solution { ...
- centos 6.5 apache配置web应用&防火墙设置(入门级)
硬件:centos 6.5 服务器 , Dell R420 , 两个网口,一个给公网,一个给内网. 软件:apache 2.2 配置了virtualhost以后,用curl在本地可以访问.但是其他机器 ...
- css3 transition的各种ease效果
http://www.w3school.com.cn/tiy/t.asp?f=css3_transition-timing-function2 linear 平均速度 ease 快启动,慢停止,物理原 ...
- poj 1847( floyd && spfa )
http://poj.org/problem?id=1847 一个水题,用来熟悉熟悉spfa和floyd的. 题意:有m条的铁路,要从x,到y, 之后分别就是条铁路与其他铁路的交点.第一个输入的为有n ...
- hdu1520
基本的树形dp #include <cstring> #include <cstdio> #include <vector> using namespace std ...