今天大家共同学习下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. namespace MvcAppOne.ActionFilters
  7. {
  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. /// <summary>
  28. /// 在action结束后执行
  29. /// </summary>
  30. /// <param name="filterContext"></param>
  31. publicoverridevoid OnActionExecuted(ActionExecutedContext filterContext)
  32. {
  33. filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":actinon执行结束" + DateTime.Now.ToString() + "<br/>");
  34. base.OnActionExecuted(filterContext);
  35. }
  36. /// <summary>
  37. /// 在result开始前执行
  38. /// </summary>
  39. /// <param name="filterContext"></param>
  40. publicoverridevoid OnResultExecuting(ResultExecutingContext filterContext)
  41. {
  42. filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":result执行开始" + DateTime.Now.ToString() + "<br/>");
  43. base.OnResultExecuting(filterContext);
  44. }
  45. /// <summary>
  46. /// 在result结束后执行
  47. /// </summary>
  48. /// <param name="filterContext"></param>
  49. publicoverridevoid OnResultExecuted(ResultExecutedContext filterContext)
  50. {
  51. filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":result执行结束" + DateTime.Now.ToString() + "<br/>");
  52. base.OnResultExecuted(filterContext);
  53. }
  54. }
  55. }
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. publicoverridevoid OnActionExecuted(ActionExecutedContext filterContext)
  12. {
  13. //异常处理
  14. if (filterContext.Exception!=null)
  15. {
  16. filterContext.ExceptionHandled=true;
  17. filterContext.Result = new RedirectResult("../shared/Error");//转向错误页面
  18. }
  19. }
  20. publicoverridevoid OnResultExecuting(ResultExecutingContext filterContext)
  21. {
  22. base.OnResultExecuting(filterContext);
  23. }
  24. publicoverridevoid OnResultExecuted(ResultExecutedContext filterContext)
  25. {
  26. base.OnResultExecuted(filterContext);
  27. }
  28. }
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. {
  4. thrownew Exception();
  5. }
        [ActionFilters.ActionDeal]
public void News()
{
throw new Exception();
}

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

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

ASP.NET MVC2.0 自定义filters的更多相关文章

  1. ASP.NET MVC2.0学习笔记:路由设置

    Route设置 在 <Professional in ASP.NET MVC2.0>一书的第四章,主要讲述了Route的简单设置.格式化设置.约束设置.区域路由.匹配文件.路由调试以及对R ...

  2. Asp.Net MVC2.0 Url 路由入门---实例篇

    本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的Vi ...

  3. Asp.Net MVC2.0 Url 路由入门---实例篇 【转】

    本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的Vi ...

  4. IIS 6.0上部署ASP.NET MVC2.0

    在IIS7.5及8.0上部署都没有成功,对于身份验证会出现问题,据说是要安装什么东西,在这里说下IIS6.0的配置吧,下面是使用.net 4.0,自己可以选择所需的版本. 再此之前先确定web是用到了 ...

  5. 在iis上部署asp.net mvc2.0

    mvc2.0是vs2010自带的,在开发环境下可以直接部署在iis中.在生产环境下,如果不能找到正确的mvc2.0版本,可以直接把开发环境下的System.Web.Mvc.dll拷贝过去使用. 1,  ...

  6. asp.net MVC2.0学习笔记

    asp.net;与mvc都是不可替代的:只是多一种选择:(解决了许多asp.net的许多缺点) model:充血模型.领域模型:很大程度的封装: 控制器:处理用户的交互,处理业务逻辑的调用,指定具体的 ...

  7. Asp.net MVC4.0自定义Html辅助方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  8. [ASP.NET MVC2 系列] ASP.Net MVC教程之《在15分钟内用ASP.Net MVC创建一个电影数据库应用程序》

    [ASP.NET MVC2 系列]      [ASP.NET MVC2 系列] ASP.Net MVC教程之<在15分钟内用ASP.Net MVC创建一个电影数据库应用程序>       ...

  9. 经典ASP.NET MVC3.0入门详解

    http://blog.csdn.net/csh624366188/article/details/7064269 :由于本文原在word文档里编写,写本文章时运用了大量截图,直接复制到博客里,没有显 ...

随机推荐

  1. WPF技术触屏上的应用系列(三): 视频播放器的使用及视频播放、播放、暂停、可拖动播放进度效果实现

    原文:WPF技术触屏上的应用系列(三): 视频播放器的使用及视频播放.播放.暂停.可拖动播放进度效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统,5 ...

  2. 我收集的sonar参考资料

    sonarQube代码质量管理工具环境筹建笔记 http://www.myexception.cn/open-source/1307345.html 配置sonar.jenkins进行持续审查 htt ...

  3. java编程规范之java命名规范

    想要成为一个优秀的程序员,首先要培养良好的编程习惯,为了提高代码的可读性,必须有好的命名规范. 这篇文章是小编结合网上的很多资料整理出来的,若有不当或错误的地方,欢迎大家指正 在文章开始前,为方便阅读 ...

  4. 《编程简介(Java) &#183;10.3递归思想》

    <编程简介(Java) ·10.3递归思想> 10.3.1 递归的概念 以两种方式的人:男人和女人:算法是两种:递归迭代/通知: 递归方法用自己的较简单的情形定义自己. 在数学和计算机科学 ...

  5. Highcharts中文教程

    http://www.hcharts.cn/docs/index.php?doc=start

  6. 【cocos2dx-3.0beta-制作flappybird】尾随时代潮流,关于引擎升级

    cocos2dx3.1版本号会被释放出,本来,我自己想要这个升级到官方的3.0版本号.只是无奈3.0坑的正式版不会做,偶数帧动画是正确及时的问题,果断放弃,随着广大淫民的支持.我已经升级到最新的代码c ...

  7. Windows 8实例教程系列 - 理解应用框架

    原文:Windows 8实例教程系列 - 理解应用框架 Windows 操作系统之所以风靡世界,是因为其“易学易用”,从用户的角度出发,让数以万计的非IT人员使用计算机实现娱乐,工作等目的.Windo ...

  8. 因host命令导致无法正常SHUTDOWN的实验

    SHUTDOWN有几个參数能够使用: SHUTDOWN NORMAL:NORMAL也是默认的子句,运行的条件是 No new connections are allowed after the sta ...

  9. Java高效读取大文件(转)

    1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung(http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分. 2.在内存中读取 读 ...

  10. Android应用程序的组成部分和Manifest文件(转)

    Android应用程序由松散耦合的组件组成,并使用应用程序Manifest绑定到一起:应用程序Manifest描述了每一组件和它们之间的交互方式,还用于指定应用程序元数据.其硬件和平台要求.外部库以及 ...