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

[转]ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)

2014-09-24 15:42 716 查看
有时候你想在调用action方法之前或者action方法之后处理一些逻辑,为了支持这个,ASP.NET MVC允许你创建action过滤器。Action过滤器是自定义的Attributes,用来标记添加Action方法之前或者Action方法之后的行为到控制器类中的Action方法中。

一些可能用到Action过滤器的地方有:

日志,异常处理

身份验证和授权 - 限制用户的访问

输出缓存 - 保存一个Action的结果

网络爬虫的过滤

本地化

动态Action - 将一个Action注入到控制器中

ASP.NET MVC为我们提供了下面的几个Filter接口:

IActionFilter


IAuthorizationFilter


IExceptionFilter


IResultFilter

要实现一个Filter,我们需要继承自FilterAttribute类同时实现上面的一个或几个接口:

public class MyFilter : FilterAttribute, IActionFilter, IResultFilter
{
}

这几个接口提供的方法如下:

[MyFilter2(Target = "HomeController")]
//[MyFilter1(Target = "HomeController")]//注意我在这里把MyFilter1注释了.
[HandleError]
public class HomeController : BaseController
{
[MyFilter2(Target = "HomeController.Filter")]
[MyFilter1(Target = "HomeController.Filter")]
public ActionResult Filter()
{
return Content("<div>这是在Action方法里面返回的内容!</div>");
}

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("<div>这是在HomeController里面重写OnActionExecuted方法添加的内容!</div>");
}

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("<div>这是在HomeController里面重写OnActionExecuting方法添加的内容!</div>");
}

protected override void OnAuthorization(AuthorizationContext filterContext)
{
filterContext.HttpContext.Response.Write("<div>这是在HomeController里面重写OnAuthorization方法添加的内容!</div>");
}

protected override void OnException(ExceptionContext filterContext)
{
filterContext.HttpContext.Response.Write("<div>这是在HomeController里面重写OnException方法添加的内容!</div>");
filterContext.ExceptionHandled = true;
}

protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("<div>这是在HomeController里面重写OnResultExecuted方法添加的内容!</div>");
}

protected override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("<div>这是在HomeController里面重写OnResultExecuting方法添加的内容!</div>");
}
}
然后我们运行一下看看结果如何:





从运行结果我们可以看到,在Controller中重写的Filter会最先执行,然后到应用在类上的Filter,然后再到应用在类方法上的Filter。

而4个接口的方法执行顺序如下:
IAuthorizationFilter ->
IActionFilter ->
IResultFilter ->
IExceptionFilter
.

而对于同一个Filter,例如
IAuthorizationFilter在MyFilter1和MyFilter2里里面的实现,又根据他们的加载顺序不同而不同。


在BaseController中应用的Filter会被子类继承,如果子类又应用了和基类同样的Filter,则会不执行基类的Filter。例如上面的HomeController应用了MyFilter2,所以调用HomeController的MyFilter2,而不是BaseController的MyFilter2。


这个执行顺序还得大家好好研究才能了解的。


同时FilterAttribute还提供了一个Order的属性,用于指定Filter的执行顺序。


每一个Action过滤器都有一个 Order 属性,用来决定Action过滤器在该范围内的执行顺序。Order属性必需是0(默认值)或者更大的整数值。省略Order属性则会给该过滤器的Order值为 -1, 表明未指明顺序。任何一个在同一范围的Action过滤器Order设为 -1 的都将按不确定的顺序执行,但在此之前过滤器有一个特定的顺序(请参考上图).

当设置Order属性的值的时候,必需指定一个唯一的值。如果两个或者更多的Action过滤器具有相同的Order属性值,将会抛出一个异常。

来看一个示例:

[Filter1(Order = 2)]
[Filter2(Order = 3)]
[Filter3(Order = 1)]
public void Index()
{
RenderView("Index");
}

Filter的执行顺序为:Filter3 => Filter1 => Filter2.

暂时就写这么多吧,这一部分主要介绍概念。Enjoy!Post by Q.Lee.lulu

本文的Blog程序示例代码: ActionFilter.rar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐