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类

     

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上面

 [ActionFilters.ActionLog(ID=3)]
        public ActionResult ShowNews()
        {
            return View();
        }


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

 

 

 

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

               我们建一个类 ActionDealAttribute

 

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

[ActionFilters.ActionDeal]
        public ActionResult News()
        {
            return View();
        }


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

        [ActionFilters.ActionDeal]
        public void News()
        {
            throw new Exception();
        }


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

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

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值