ASP.NET MVC AOP-Filter

来源:互联网 发布:淘宝客服转正工作业绩 编辑:程序博客网 时间:2024/05/30 04:44

      软件开发模式从面向过程(POP)发展到面向对象(OOP)之后,软件模块之间的组织方式发生了很多变化,衍生出了很多可插拔的模块化组件,给软件的灵活架构方面带来了丰富多彩的内容。面相对象的思维方式可谓功不可没,在日趋复杂的应用系统中,有很多基本的业务逻辑,跟具体的业务关系很小,甚至没有关系,比如日志,参数校验,权限,等等各种常规功能,这时候我们就需要面相切面编程-AOP

ASP.NET MVC 在控制器加载及执行过程中,为了让用户能够扩展控制器执行过程中的功能,提供了让用户重OnActionExecuting,OnActionExecuted,OnResultExecuting,OnResultExecuted几个方法的机制。这样用户就可以灵活地控制Action和Result的执行过程。其实,这就是AOP在ASP.NET MVC 中最好的实现,也是ASP.NET MVC 在设计中非常具有借鉴意义的部分,为我们设计具有AOP机制的模块具有很好的借鉴意义。

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace AspNetMvcFilterDemo.Filters{    public class MyFilter : ActionFilterAttribute    {        public override void OnActionExecuting(ActionExecutingContext filterContext)        {            filterContext.HttpContext.Response.Write("Method Name:OnActionExecuting<br/>");            //输出请求的Controller 与action名称            String controllerName = filterContext.RouteData.Values["controller"].ToString();            String actionName = filterContext.RouteData.Values["action"].ToString();            String message = String.Format("Controller :{0}<br/>action:{1}<br/>", controllerName, actionName);            filterContext.HttpContext.Response.Write(message);            filterContext.HttpContext.Response.Write("------------------------------------<br>");            //base.OnActionExecuting(filterContext);        }        public override void OnActionExecuted(ActionExecutedContext filterContext)        {            filterContext.HttpContext.Response.Write("Method Name:OnActionExecuted<br/>");            //输出请求的Controller 与action名称            String controllerName = filterContext.RouteData.Values["controller"].ToString();            String actionName = filterContext.RouteData.Values["action"].ToString();            String message = String.Format("Controller :{0}<br/>action:{1}<br/>", controllerName, actionName);            filterContext.HttpContext.Response.Write(message);            filterContext.HttpContext.Response.Write("------------------------------------<br/>");            //base.OnActionExecuted(filterContext);        }        public override void OnResultExecuting(ResultExecutingContext filterContext)        {            filterContext.HttpContext.Response.Write("Method Name:OnResultExecuting<br/>");            //输出请求的Controller 与action名称            String controllerName = filterContext.RouteData.Values["controller"].ToString();            String actionName = filterContext.RouteData.Values["action"].ToString();            String message = String.Format("Controller :{0}<br/>action:{1}<br/>", controllerName, actionName);            filterContext.HttpContext.Response.Write(message);            filterContext.HttpContext.Response.Write("------------------------------------<br/>");            //base.OnResultExecuting(filterContext);        }        public override void OnResultExecuted(ResultExecutedContext filterContext)        {            filterContext.HttpContext.Response.Write("Method Name:OnResultExecuted<br/>");            //输出请求的Controller 与action名称            String controllerName = filterContext.RouteData.Values["controller"].ToString();            String actionName = filterContext.RouteData.Values["action"].ToString();            String message = String.Format("Controller :{0}<br/>action:{1}<br/>", controllerName, actionName);            filterContext.HttpContext.Response.Write(message);            filterContext.HttpContext.Response.Write("------------------------------------<br/>");            //base.OnResultExecuted(filterContext);        }    }}
我们就可以在控制器上使用Attribute

[MyFilter]public ActionResult Index(){      return View();}
效果:



0 0