您的位置:首页 > 编程语言 > ASP

ASP.NET MVC2.0 自定义filters

2013-10-09 16:13 405 查看
今天大家共同学习下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类

[csharp] view plaincopyprint?

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

[csharp] view plaincopyprint?

[ActionFilters.ActionLog(ID=3)]

public ActionResult ShowNews()

{

return View();

}

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

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



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

我们建一个类 ActionDealAttribute

[csharp] view plaincopyprint?

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

[csharp] view plaincopyprint?

[ActionFilters.ActionDeal]

public ActionResult News()

{

return View();

}

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

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

[csharp] view plaincopyprint?

[ActionFilters.ActionDeal]

publicvoid News()

{

thrownew Exception();

}

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

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

代码下载:http://download.csdn.net/detail/zx13525079024/4375094
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: