8. Action过滤

Action过滤

原文: http://quickstarts.asp.net/3-5-extensions/mvc/ActionFiltering.aspx

1. 介绍
一般Action与用户动作是一对一的关系,用户的某一个动作对应一个特定的Action.
然而,有时你可能会希望在Action执行的前后执行指定的操作,MVC中可以通过Action过滤器来实现这个功能.
Action过滤器是一个自定义的Attribute,它的应用范围包括:日志,身份认证和授权,输出缓存,Web抓取过滤,本地化,动态Action等.

2. 实现一个Action过滤器
Action过滤器必须派生自ActionFilterAttribute抽象类,并实现OnActionExecutingOnActionExecuted两个方法。一个示例如下:
public class LoggingFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(FilterExecutingContext filterContext)
{
filterContext.HttpContext.Trace.Write("Starting: " +
filterContext.ActionMethod.Name);
}

public override void OnActionExecuted(FilterExecutedContext filterContext)
{
if (filterContext.Exception != null)
{
filterContext.HttpContext.Trace.Write("Exception thrown");
}
}
}
3. Action过滤器上下文
过滤器上下文包括FilterExecutingContext和FilterExecutedContext两个,他们都派生自FilterContext类,提供ActionMethod属性,用于获取Action方法的信息。
FilterExecutingContext包含一个Cancel属性,允许你取消正在执行的Action。
FilterExecutedContent包含ExceptionExceptionHandled属性。若Action执行期间没有错误发生,则Exception属性为null,若Exception属性不为null,且其他过滤器已经处理过这个异常,则ExceptionHandled属性的值为true。

4. 在控制器中使用过滤器
给需要使用过滤器的Action方法加上想要的过滤器Attribute即可。如:
public class HomeController : Controller
{
[LoggingFilter]
public void Index()
{
RenderView("Index");
}
}
5. 实现“控制器级”的过滤器
可能出现一种情况:控制器中的所有Action方法都需要同一个过滤器。这是可以通过重写控制器类的OnActionExecutingOnActionExecuted方法来实现过滤器。

6. Action过滤器的范围
过滤器是可继承的。

7. 过滤器的执行顺序
过滤器提供了Order顺序来指定多个过滤器的执行顺序。Order的值必须为0或正数,若Order为-1,则表明不指定该过滤器的执行顺序,它将在所有被指定顺序的过滤器执行之后执行。另外,若两个过滤器的Order值相同将会产生异常。一个例子如下:
[Filter1(Order = 2)]
[Filter2(Order = 3)]
[Filter3(Order = 1)]
public void Index()
{
RenderView("Index");
}
另外,过滤器的两个方法以及“控制器级”的过滤器的两个方法之间的执行顺序也有规定,详见原文。

8. 过滤器执行顺序的例子

posted on 2008-05-06 17:00  Na57  阅读(627)  评论(0编辑  收藏  举报