ASP.NET MVC2.0 自定义filters

今天大家共同学习下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类

     

  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
    {
        /// <summary>
        /// 表示actionID
        /// </summary>
        public int ID
        {
            get;
            set;
        }
        /// <summary>
        /// 在 action开始前执行
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":actinon开始执行" + DateTime.Now.ToString() + "<br/>");
            base.OnActionExecuting(filterContext);
        }

        /// <summary>
        /// 在action结束后执行
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":actinon执行结束" + DateTime.Now.ToString() + "<br/>");
            base.OnActionExecuted(filterContext);
        }

        /// <summary>
        /// 在result开始前执行
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":result执行开始" + DateTime.Now.ToString() + "<br/>");
            base.OnResultExecuting(filterContext);
        }

        /// <summary>
        /// 在result结束后执行
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":result执行结束" + DateTime.Now.ToString() + "<br/>");
            base.OnResultExecuted(filterContext);
        }

    }
}

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

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

  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

 

  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中进行处理

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

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

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

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

代码下载:http://download.csdn.net/detail/zx13525079024/4375094

posted on 2013-10-09 16:13  itjeff  阅读(375)  评论(0编辑  收藏  举报

导航