zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Linux下查看操作系统信息、内存情况及cpu信息:cpu个数、核心数、线程数
    SIM800C Couldn't pair with xxx because of an incorrect PIN or passkey
    SIM800C 使用基站定位
    SIM800C 透传模式
    paho.mqtt.embedded-c MQTTPacket transport.c hacking
    paho.mqtt.embedded-c MQTTPacket pub0sub1.c hacking
    RESTful API 学习
    MQTT连接服务器返回2
    Qemu编译qemu-system-arm
    adb安装启动Touch校正软件
  • 原文地址:https://www.cnblogs.com/itjeff/p/3359431.html
Copyright © 2011-2022 走看看