MVC过滤器详解和示例

MVC过滤器一共分为四个:ActionFilter(方法过滤器),ResultFilter(结果过滤器,感觉不是很好听,就这样叫吧),AuthorizationFilter(授权过滤器),ExceptionFilter(异常处理过滤器)

过滤器类型接口默认实现描述
ActionIActionFilterActionFilterAttribute在动作方法之前及之后运行
ResultIResultFilterActionFilterAttribute在动作结果被执行之前和之后运行
AuthorizationFilterIAuthorizationFilterAuthorizeAttribute首先运行,在任何其它过滤器动作方法之前运行
ExceptionIExceptionFilterHandleErrorAttribute只在另外一个过滤器,动作方法,动作结果弹出异常时运行


示例:Action方法过滤器

[csharp]  view plain  copy
  1. /// <summary>  
  2.     /// Action方法 过滤器 类  
  3.     /// </summary>  
  4.     public class MyActionFilterAttribute : ActionFilterAttribute  
  5.     {  
  6.         /// <summary>  
  7.         /// 在  Action方法之前 调用  
  8.         /// </summary>  
  9.         /// <param name="filterContext"></param>  
  10.         public override void OnActionExecuting(ActionExecutingContext filterContext)  
  11.         {  
  12.             //1. RouteData 中 保存了 当前请求 匹配的 路由信息和路由对象  
  13.             //             如果本次请求 是请求了某个 区域 里的 控制器方法,还可以通过filterContext.RouteData.DataTokens["area"]获取区域名  
  14.   
  15.             //string strArea = filterContext.RouteData.DataTokens["area"].ToString();  
  16.             string strController = filterContext.RouteData.Values["controller"].ToString();  
  17.             string strAction = filterContext.RouteData.Values["action"].ToString();  
  18.             //filterContext.RouteData.GetRequiredString  
  19.   
  20.             //2.另一种方式 获取 请求的 类名和方法名  
  21.             string strAction2 = filterContext.ActionDescriptor.ActionName;  
  22.             string strController2 = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;  
  23.   
  24.             //2.1检查 被请求方法 是否 加了 MoneyAttribute 特性  
  25.             if (filterContext.ActionDescriptor.IsDefined(typeof(Filters.MoneyAttribute), false))  
  26.             {  
  27.                 //直接为 请求 设置 返回结果,而不执行 对应的 Action 方法,也不执行 OnActionExcuted,但是,会执行 Result过滤器和 生成视图  
  28.                 filterContext.Result = new ContentResult() { Content = "<br/>哈哈哈,直接被跳过了吧~~~!<br/>" };  
  29.             }     
  30.   
  31.             filterContext.HttpContext.Response.Write("哇哈哈哈~!OnActionExecuting<br/>");  
  32.             base.OnActionExecuting(filterContext);  
  33.         }  
  34.   
  35.         /// <summary>  
  36.         /// 在  Action方法之后 调用  
  37.         /// </summary>  
  38.         /// <param name="filterContext"></param>  
  39.         public override void OnActionExecuted(ActionExecutedContext filterContext)  
  40.         {  
  41.             filterContext.HttpContext.Response.Write("哇哈哈哈~!OnActionExecuted<br/>");  
  42.             base.OnActionExecuted(filterContext);  
  43.         }  

使用方法1:将过滤器加到方法上

[csharp]  view plain  copy
  1. [Filters.MyActionFilter]//1.将 过滤器 加到方法上  
  2.        [Filters.Money]  
  3.        [Filters.MyResultFilter]  
  4.        [Filters.MyAuthorize]  
  5.        public ActionResult Index()  
  6.        {  
  7.            Response.Write("Index 方法<br/>");  
  8.            ViewBag.name = "时间:" + DateTime.Now;  
  9.            return View();  
  10.        }  

使用方法2:将过滤器加到方类上

[csharp]  view plain  copy
  1. [Filters.MyActionFilter]  
  2.     public class HomeController : Controller  
  3.     {  
  4.     }  

使用方法3:添加全局过滤器,即添加到FilterConfig.cs中

[csharp]  view plain  copy
  1. public class FilterConfig  
  2.    {  
  3.        public static void RegisterGlobalFilters(GlobalFilterCollection filters)  
  4.        {  
  5.            //filters.Add(new HandleErrorAttribute());  
  6.   
  7.            //3. 添加全局过滤器  
  8.            filters.Add(new Filters.MyActionFilterAttribute());  
  9.   
  10.            filters.Add(new Filters.MyHandleErrorAttribute());  
  11.        }  
  12.    }  


示例:Result过滤器

[csharp]  view plain  copy
  1. /// <summary>  
  2.    /// Result 过滤器 类 - 如果请求的是 要加载视图的 Action 方法的话  
  3.    ///                   在 视图加载 前 后 调用方法  
  4.    /// </summary>  
  5.    public class MyResultFilterAttribute:System.Web.Mvc.ActionFilterAttribute  
  6.    {  
  7.        /// <summary>  
  8.        /// 加载 "视图" 前执行  
  9.        /// </summary>  
  10.        /// <param name="filterContext"></param>  
  11.        public override void OnResultExecuting(System.Web.Mvc.ResultExecutingContext filterContext)  
  12.        {  
  13.            filterContext.HttpContext.Response.Write("加载 视图 前执行 OnResultExecuting <br/>");  
  14.            base.OnResultExecuting(filterContext);  
  15.        }  
  16.   
  17.        /// <summary>  
  18.        /// 加载"视图" 后执行  
  19.        /// </summary>  
  20.        /// <param name="filterContext"></param>  
  21.        public override void OnResultExecuted(System.Web.Mvc.ResultExecutedContext filterContext)  
  22.        {  
  23.            filterContext.HttpContext.Response.Write("加载 视图 后执行 OnResultExecuted <br/>");  
  24.            base.OnResultExecuted(filterContext);  
  25.        }  
  26.    }  

示例:授权过滤器 - 在 Action过滤器前 执行

[csharp]  view plain  copy
  1. /// <summary>  
  2.     /// 授权过滤器 - 在 Action过滤器前 执行  
  3.     /// </summary>  
  4.     public class MyAuthorizeAttribute:AuthorizeAttribute  
  5.     {  
  6.         public override void OnAuthorization(AuthorizationContext filterContext)  
  7.         {  
  8.             filterContext.HttpContext.Response.Write("<br/>OnAuthorization<br/>");  
  9.             //注释掉 父类方法,因为 父类里的 OnAuthorization 方法会 调用 asp.net的授权验证机制!  
  10.             //base.OnAuthorization(filterContext);  
  11.         }  
  12.     }  

示例:Exception过滤器

[csharp]  view plain  copy
  1. /// <summary>  
  2.     /// 异常处理 过滤器  
  3.     /// </summary>  
  4.     public class MyHandleErrorAttribute : HandleErrorAttribute  
  5.     {  
  6.         public override void OnException(ExceptionContext filterContext)  
  7.         {  
  8.             //1.获取异常对象  
  9.             Exception ex = filterContext.Exception;  
  10.             //2.记录异常日志  
  11.             //3.重定向友好页面  
  12.             filterContext.Result = new RedirectResult("~/error.html");  
  13.             //4.标记异常已经处理完毕  
  14.             filterContext.ExceptionHandled = true;  
  15.   
  16.             base.OnException(filterContext);  
  17.         }  
  18.     }  
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值