一、概念定义

Filter是一种声明式编程方式,在Asp.net MVC中它只能限制于Action(或它的Controller)。

Filter用途广泛:(1)判断登录与否或用户权限;(2)决策输出缓存;(3)防盗链;(4)防蜘蛛;(5)本地化与国际化设置(6)实现动态Action。

Filter要继承于ActionFilterAttribute抽象类,并覆写四个方法:

(1)OnActionExecuting是Action执行前的操作;(2)OnActionExecuted则是Action执行后的操作;

(3)OnResultExecuting是解析ActionResult前执行;(4)OnResultExecuted是解析ActionResult后执行。

二、创建filter类:类需要继承一个接口,并且重写4个方法

public class paramFilter : System.Web.Mvc.ActionFilterAttribute
{
//Action执行前的操作
public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.QueryString["k"] == "go")
{
string retUrl = filterContext.RouteData.GetRequiredString("controller") + "/" + filterContext.RouteData.GetRequiredString("action");
filterContext.HttpContext.Response.Redirect("http://" + filterContext.HttpContext.Request.Url.Host + ":" + filterContext.HttpContext.Request.Url.Port.ToString() + "/" + retUrl);
}
} //Action执行后的操作
public override void OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
} //解析ActionResult前执行
public override void OnResultExecuting(System.Web.Mvc.ResultExecutingContext filterContext)
{
base.OnResultExecuting(filterContext);
} //解析ActionResult后执行
public override void OnResultExecuted(System.Web.Mvc.ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
}
}

注意:其中 filterContext对象是从页面传过来的。

其中ActionExecutingContext类其属性如下表:

ActionDescriptor 获取或设置操作描述符。
ActionParameters 获取或设置操作方法参数。
Controller 获取或设置控制器。 (从 ControllerContext继承。)
DisplayMode 获取显示模式。 (从 ControllerContext继承。)
HttpContext 获取或设置 HTTP 上下文。 (从 ControllerContext继承。)
IsChildAction 获取一个值,该值指示关联的操作方法是否为子操作。 (从 ControllerContext继承。)
ParentActionViewContext 获取一个对象,该对象包含父操作方法的视图上下文信息。 (从 ControllerContext继承。)
RequestContext 获取或设置请求上下文。 (从 ControllerContext继承。)
Result 获取或设置由操作方法返回的结果。
RouteData 获取或设置 URL 路由数据。 (从 ControllerContext继承。)

获取页面controller值:filterContext.RouteData.GetRequiredString("controller")
获取页面action值:filterContext.RouteData.GetRequiredString("action")
其他页跳转面:filterContext.HttpContext.Response.Redirect()
获取ip地址:filterContext.HttpContext.Request.Url.Host 
获取端口:filterContext.HttpContext.Request.Url.Port.ToString()

三、Filter应用在Controller上的使用方式

1、直接将Filter应用在Controller上,如:

[paramFilter]
public class UserController : Controller{}

2、重写Controller内的 OnActionExecuting/OnActionExecuted/OnResultExecuting/OnResultExecuted的四个方法。

四、以下为几个系统的Filter。

1、AcceptVerbs:规定页面的访问形式

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Example(){ return View(); }

2、ActionName:规定Action的名称。

应用场景:如果不想用方法名做为Action名,或Action名为关键字的话,如
[ActionName("UserLog")]
public ActionResult Login(){ return View(); }

3、NonAction:当前方法仅是普通方法不解析为Action。

4、ValidateInput:该Action可以接受Html等危险代码(ASP.NET MVC在aspx中设置<%@ Page 的属性无法完成等同任务)

[ValidateInput(false)]
public ActionResult List() { return View(); }

5、ValidateAntiForgeryTokenAttribute:用于验证服务器篡改。

[ValidateAntiForgeryToken]
public ActionResult UserAdd() { return View(); }

五、Filter的集中应用场景介绍

1、使用场景:验证登录等。

public class LoginFilterAttribute:ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//当用户没有验证时
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{ filterContext.Result = new RedirectToRouteResult("Default",
new RouteValueDictionary(new {action="Login"})
);
}
}
}

[LoginFilterAttribute]

public ActionResult Index()

2、使用场景:异常处理

public class ErrorActionFilter:ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.Exception != null)
{
filterContext.Canceled = true;
filterContext.Result = new RedirectToRouteResult("Demo", new RouteValueDictionary(new { action = "ErrorPage" }));
}
}
} [ErrorActionFilter]
public void ErrorHandler() { throw new Exception(); }

3、OnResultExecuting:在result执行前发生(在view 呈现前);使用场景:设置客户端缓存,服务器端压缩。

4、OnResultExecuted:在result执行后发生,使用场景:异常处理,页面尾部输出调试信息。

MVC的Filter应用小结的更多相关文章

  1. MVC数据验证使用小结

    原文:MVC数据验证使用小结 描述:MVC数据验证使用小结 内容:display,Required,stringLength,Remote,compare,RegularExpression 本人最近 ...

  2. 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程

    反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑)   背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...

  3. ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)

    上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...

  4. Asp.net mvc自定义Filter简单使用

    自定义Filter的基本思路是继承基类ActionFilterAttribute,并根据实际需要重写OnActionExecuting,OnActionExecuted,OnResultExecuti ...

  5. Asp.net MVC使用Filter解除Session, Cookie等依赖

    本文,介绍了Filter在MVC请求的生命周期中的作用和角色,以及Filter的一些常用应用场景. 同时针对MVC中的对于Session,Cookie等的依赖,如何使用Filter解依赖. 如果大家有 ...

  6. [转]Asp.net MVC使用Filter解除Session, Cookie等依赖

    本文转自:http://www.cnblogs.com/JustRun1983/p/3279139.html 本文,介绍了Filter在MVC请求的生命周期中的作用和角色,以及Filter的一些常用应 ...

  7. [asp.net mvc]自定义filter

    写在前面 最近在摸索mvc,在app中的webview中嵌入h5应用,经常需要用到对cookie的读取操作.所以想到通过自定义的filter截取cookie,然后通过在action上面打特性的方式针对 ...

  8. MVC Action Filter

    ASP.NET MVC Framework支持四种不同类型的Filter: Authorization filters – 实现IAuthorizationFilter接口的属性. Action fi ...

  9. ASP.NET MVC 过滤器Filter

    在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能 判断登录与否或用户权限 决策输出缓存 防盗链 防蜘蛛 本地化与国际化设置 实现动态Action Filter是一种声明式编 ...

随机推荐

  1. Python文件类型

    Python的文件类型分为三种:源代码.字节代码.优化代码. 1. 源代码    Python源代码文件,即py脚本文件,由 python.exe 解释,可在控制台下运行.pyw脚本文件是图形用户接口 ...

  2. codevs 1001 舒适的线路 kruskal/gcd

    舒适的线路 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.codevs.cn/problem/1001/ Description Z小 ...

  3. [Database] MongoDB 副本集配置

    MongoDB 副本集配置 MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允许您从硬 ...

  4. Linux入门基础篇

    Linux入门基础篇 Linux诞生 Linux发行版本说明 Linux官方网站 Linux内核官方网站 比较有名的Linux发行版 虚拟机(Virtual Machine),一个虚拟的系统,安装在系 ...

  5. 国产Linux滋生腐败

    回想过去,2002年12月11日至12日,信息产业部与科技部联合主办"Linux软件与应用猜測研讨会".影响中国IT业的重要人士,包含政府决策者.学界权威.主要Linux推动厂商等 ...

  6. Moq的一些基本用法

    本篇体验Moq的一些基本用法.首先通过NuGet安装Moq.包括: 模拟方法的返回值 模拟方法后执行回调函数 模拟方法依次返回多个值 模拟第二次调用方法返回异常 直接返回被模拟方法的原始返回值 模拟泛 ...

  7. 委托、多播委托、泛型委托Func,Action,Predicate,ExpressionTree

    当试图通过一个事件触发多个方法,抽象出泛型行为的时候,或许可以考虑使用委托.     通过委托构造函数或委托变量把方法赋值给委托 private delegate double DiscountDel ...

  8. [Shell学习笔记] 命令行下的高级网络工具cURL命令

    原文: http://www.1987.name/365.html Linux curl命令是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯 ...

  9. 3. python 字符串的一般使用

    3. python 字符串的一般使用 1.基本操作 1)使用+连接 >>> "abc"+"efg"    'abcefg'    >&g ...

  10. 转: gob编解码

    要让数据对象能在网络上传输或存储,我们需要进行编码和解码.现在比较流行的编码方式有JSON,XML等.然而,Go在gob包中为我们提供了另一种方式,该方式编解码效率高于JSON.gob是Golang包 ...