博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET MVC2.0 自定义filters
阅读量:6940 次
发布时间:2019-06-27

本文共 6557 字,大约阅读时间需要 21 分钟。

今天大家共同学习下ASP.NET MVC2.0中自定义filters,这一节主要学习下ActionFilterAttribute

    ActionFilterAttribute继承IActionFilter, IResultFilter接口,并且继承FilterAttribute.

     ActionFilterAttribute可以监控action执行过程中所有阶段,包括日志,异常处理等功能.

      主要包括以下四个重载方法

       OnActionExecuting,OnActionExecuted,OnResultExecuting,OnResultExecuted

 

1.OnActionExecuting是在action开始前执行

  用于身份验证和服务器端缓存输出

2. OnActionExecuted在action结束后执行

主要用于异常处理

3. OnResultExecuting在返回result前执行

    主要用于设置客户端缓存和服务器端压缩

4. OnResultExecuted在返回result后执行

   主要用于异常处理和页面尾部输出调试信息

以下两个DEMO,将展示actionfilter的具体用法

   demo1:

        在这个DEMO中我们将展示action在各个阶段的执行时间,并在页面中输出。

        首先我们定义一个ActionLogAttribute类

     

[csharp]
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Web; 
  5. using System.Web.Mvc; 
  6.  
  7. namespace MvcAppOne.ActionFilters 
  8.     publicclass ActionLogAttribute : ActionFilterAttribute 
  9.     { 
  10.         /// <summary> 
  11.         /// 表示actionID 
  12.         /// </summary> 
  13.         publicint ID 
  14.         { 
  15.             get
  16.             set
  17.         } 
  18.         /// <summary> 
  19.         /// 在 action开始前执行 
  20.         /// </summary> 
  21.         /// <param name="filterContext"></param> 
  22.         publicoverridevoid OnActionExecuting(ActionExecutingContext filterContext) 
  23.         { 
  24.             filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":actinon开始执行" + DateTime.Now.ToString() + "<br/>"); 
  25.             base.OnActionExecuting(filterContext); 
  26.         } 
  27.  
  28.         /// <summary> 
  29.         /// 在action结束后执行 
  30.         /// </summary> 
  31.         /// <param name="filterContext"></param> 
  32.         publicoverridevoid OnActionExecuted(ActionExecutedContext filterContext) 
  33.         { 
  34.             filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":actinon执行结束" + DateTime.Now.ToString() + "<br/>"); 
  35.             base.OnActionExecuted(filterContext); 
  36.         } 
  37.  
  38.         /// <summary> 
  39.         /// 在result开始前执行 
  40.         /// </summary> 
  41.         /// <param name="filterContext"></param> 
  42.         publicoverridevoid OnResultExecuting(ResultExecutingContext filterContext) 
  43.         { 
  44.             filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":result执行开始" + DateTime.Now.ToString() + "<br/>"); 
  45.             base.OnResultExecuting(filterContext); 
  46.         } 
  47.  
  48.         /// <summary> 
  49.         /// 在result结束后执行 
  50.         /// </summary> 
  51.         /// <param name="filterContext"></param> 
  52.         publicoverridevoid OnResultExecuted(ResultExecutedContext filterContext) 
  53.         { 
  54.             filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":result执行结束" + DateTime.Now.ToString() + "<br/>"); 
  55.             base.OnResultExecuted(filterContext); 
  56.         } 
  57.  
  58.     } 
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace MvcAppOne.ActionFilters{    public class ActionLogAttribute : ActionFilterAttribute    {        ///         /// 表示actionID        ///         public int ID        {            get;            set;        }        ///         /// 在 action开始前执行        ///         ///         public override void OnActionExecuting(ActionExecutingContext filterContext)        {            filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":actinon开始执行" + DateTime.Now.ToString() + "
"); base.OnActionExecuting(filterContext); } /// /// 在action结束后执行 /// /// public override void OnActionExecuted(ActionExecutedContext filterContext) { filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":actinon执行结束" + DateTime.Now.ToString() + "
"); base.OnActionExecuted(filterContext); } /// /// 在result开始前执行 /// /// public override void OnResultExecuting(ResultExecutingContext filterContext) { filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":result执行开始" + DateTime.Now.ToString() + "
"); base.OnResultExecuting(filterContext); } /// /// 在result结束后执行 /// /// public override void OnResultExecuted(ResultExecutedContext filterContext) { filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":result执行结束" + DateTime.Now.ToString() + "
"); base.OnResultExecuted(filterContext); } }}

然后我们建立一个VIEW页面,ShowNews页面

   然后再建立一个ACTION,并把属性标记在action上面

[csharp]
  1. [ActionFilters.ActionLog(ID=3)] 
  2.        public ActionResult ShowNews() 
  3.        { 
  4.            return View(); 
  5.        } 
[ActionFilters.ActionLog(ID=3)]        public ActionResult ShowNews()        {            return View();        }

  此时我们运行ShowNews页面,我们将看到如下效果

 

 

demo2: 接着我们看第二个DEMO,在这个demo中,我们将展现actionFILTER中各个方法的作用

               我们建一个类 ActionDealAttribute

 

[csharp]
  1. publicclass ActionDealAttribute : ActionFilterAttribute 
  2.     { 
  3.         publicoverridevoid OnActionExecuting(ActionExecutingContext filterContext) 
  4.         { 
  5.             //用户没有验证通过,转向登录页面 
  6.             if (!filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated) 
  7.             { 
  8.                 filterContext.Result = new RedirectResult("../account/logon"); 
  9.             } 
  10.         } 
  11.  
  12.         publicoverridevoid OnActionExecuted(ActionExecutedContext filterContext) 
  13.         { 
  14.             //异常处理 
  15.             if (filterContext.Exception!=null
  16.             { 
  17.                 filterContext.ExceptionHandled=true
  18.                 filterContext.Result = new RedirectResult("../shared/Error");//转向错误页面 
  19.             } 
  20.  
  21.         } 
  22.  
  23.         publicoverridevoid OnResultExecuting(ResultExecutingContext filterContext) 
  24.         { 
  25.             base.OnResultExecuting(filterContext); 
  26.         } 
  27.  
  28.         publicoverridevoid OnResultExecuted(ResultExecutedContext filterContext) 
  29.         { 
  30.             base.OnResultExecuted(filterContext); 
  31.         } 
  32.  
  33.     } 
public class ActionDealAttribute : ActionFilterAttribute    {        public override void OnActionExecuting(ActionExecutingContext filterContext)        {            //用户没有验证通过,转向登录页面            if (!filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated)            {                filterContext.Result = new RedirectResult("../account/logon");            }        }        public override void OnActionExecuted(ActionExecutedContext filterContext)        {            //异常处理            if (filterContext.Exception!=null)            {                filterContext.ExceptionHandled=true;                filterContext.Result = new RedirectResult("../shared/Error");//转向错误页面            }        }        public override void OnResultExecuting(ResultExecutingContext filterContext)        {            base.OnResultExecuting(filterContext);        }        public override void OnResultExecuted(ResultExecutedContext filterContext)        {            base.OnResultExecuted(filterContext);        }    }

  再建立一个news页面,并建立一个对应的action

  如果访问news页面需要登录才能访问,就在news对应的action标记此属性,在OnActionExecuting中进行处理

[csharp]
  1. [ActionFilters.ActionDeal] 
  2.         public ActionResult News() 
  3.         { 
  4.             return View(); 
  5.         } 
[ActionFilters.ActionDeal]        public ActionResult News()        {            return View();        }

如果news页面访问的时候出现异常,就会转向错误页面,在OnActionExecuted中进行处理

[csharp]
  1. [ActionFilters.ActionDeal] 
  2. publicvoid News() 
  3.     thrownew Exception(); 
[ActionFilters.ActionDeal]        public void News()        {            throw new Exception();        }

以上只是自定义action的简单用法,供大家参考。

代码下载:

转载地址:http://pgnnl.baihongyu.com/

你可能感兴趣的文章
破译密码、设计飞机和建设团队:Randy Shoup谈高绩效团队
查看>>
缓存分享会小记
查看>>
正则匹配常见链接地址
查看>>
Yii2.0 框架中如何创建自定义小部件
查看>>
亚马逊DevOps的实践指南
查看>>
PHP|关于对象复制的一些事
查看>>
Python 性能分析大全
查看>>
GoJS 绘图 (十) :链接(完结)
查看>>
PHP|什么是CGI, FastCGI, PHP-CGI, PHP-FPM, Spawn-FCGI?
查看>>
【算法】递归算法之n阶矩阵行列式求解
查看>>
React Native 的默认单位和自适应布局方案
查看>>
ReactNative安卓首屏白屏优化
查看>>
设计模式(Design Pattern)系列之.NET专题
查看>>
为 Nginx 添加 HTTP 基本认证(HTTP Basic Authentication)
查看>>
gulp使用ES6
查看>>
ECUG Con 邀您共议服务端开发最深度实践
查看>>
关于优惠券功能设计之我的见解
查看>>
JavaScript中的函数式编程二(翻译)
查看>>
Javascript的异步编程:Promise
查看>>
荣誉,还是苦逼?| 也议全栈工程师和DevOps
查看>>