
今天大家共同学习下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
- {
- publicclass ActionLogAttribute : ActionFilterAttribute
- {
- /// <summary>
- /// 表示actionID
- /// </summary>
- publicint ID
- {
- get;
- set;
- }
- /// <summary>
- /// 在 action开始前执行
- /// </summary>
- /// <param name="filterContext"></param>
- publicoverridevoid 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>
- publicoverridevoid 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>
- publicoverridevoid 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>
- publicoverridevoid OnResultExecuted(ResultExecutedContext filterContext)
- {
- filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":result执行结束" + DateTime.Now.ToString() + "<br/>");
- base.OnResultExecuted(filterContext);
- }
- }
- }
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();
- }
[ActionFilters.ActionLog(ID=3)]
public ActionResult ShowNews()
{
return View();
}
此时我们运行ShowNews页面,我们将看到如下效果
demo2: 接着我们看第二个DEMO,在这个demo中,我们将展现actionFILTER中各个方法的作用
我们建一个类 ActionDealAttribute
- publicclass ActionDealAttribute : ActionFilterAttribute
- {
- publicoverridevoid OnActionExecuting(ActionExecutingContext filterContext)
- {
- //用户没有验证通过,转向登录页面
- if (!filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated)
- {
- filterContext.Result = new RedirectResult("../account/logon");
- }
- }
- publicoverridevoid OnActionExecuted(ActionExecutedContext filterContext)
- {
- //异常处理
- if (filterContext.Exception!=null)
- {
- filterContext.ExceptionHandled=true;
- filterContext.Result = new RedirectResult("../shared/Error");//转向错误页面
- }
- }
- publicoverridevoid OnResultExecuting(ResultExecutingContext filterContext)
- {
- base.OnResultExecuting(filterContext);
- }
- publicoverridevoid OnResultExecuted(ResultExecutedContext filterContext)
- {
- base.OnResultExecuted(filterContext);
- }
- }
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();
- }
[ActionFilters.ActionDeal]
public ActionResult News()
{
return View();
}
如果news页面访问的时候出现异常,就会转向错误页面,在OnActionExecuted中进行处理
- [ActionFilters.ActionDeal]
- publicvoid News()
- {
- thrownew Exception();
- }
[ActionFilters.ActionDeal]
public void News()
{
throw new Exception();
}
以上只是自定义action的简单用法,供大家参考。