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