一、概念定义
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执行后发生,使用场景:异常处理,页面尾部输出调试信息。