您的位置:首页 > 编程语言 > ASP

ASP.NET MVC AOP-Filter

2015-06-06 22:08 656 查看
软件开发模式从面向过程(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();
}
效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: