您的位置:首页 > 其它

第13章_了解MVC3中Filters(第二篇)过滤器执行顺序

2011-09-19 22:52 295 查看
MVC3、过滤器、Filters
大家好,今晚讲一起学习的是,过滤器属性的执行顺序。好了,接下看看一个简单的说明吧!

例如,我们创建一个SimpleMessageAttribute 实现 FilterAttribute, IActionFilter

中的两个方法。

 public class SimpleMessageAttribute : FilterAttribute, IActionFilter

 {

        public string Message { get; set; }

        public void OnActionExecuting(ActionExecutingContext filterContext)

        {

            filterContext.HttpContext.Response.Write(

            string.Format("[Before Action: {0}]", Message));

        }

        public void OnActionExecuted(ActionExecutedContext filterContext)

        {

            filterContext.HttpContext.Response.Write(

            string.Format("[After Action: {0}]", Message));

        }

}

上面的属性创建好了,应用到我们要过滤的控制器上,如下:

//调用

[SimpleMessage(Message="A")] //给属性全付值

[SimpleMessage(Message="B")]

public ActionResult Index() {

Response.Write("Action method is running");

return View();

}

请问先输出的结果是???大家想一下??? 大家自己也可以写一个小例子测试下了。。。

好了,在此没有指定Order属性值,所以执行的顺序是:

1.(Message="A")里面的OnActionExecuting

2.(Message="B")里面的OnActionExecuting

3.(Message="B")里面的OnActionExecuted

4.(Message="A")里面的OnActionExecuted

---------------------------------------------------------------------

接下来在过滤器中使用的顺序属性

[SimpleMessage(Message="A", Order=2)]

[SimpleMessage(Message="B", Order=1)]

输出的结果又是???

输出的结果如下:

1.(Message="B")里面的OnActionExecuting

2.(Message="A")里面的OnActionExecuting

3.(Message="A")里面的OnActionExecuted

4.(Message="B")里面的OnActionExecuted

---------------------------------------------------------------------

好了,我们再测试一个东西,和Global.asax.cs的全局过滤器来执行一下顺序。

1.先做几个准备工作到全局过滤器下注册一下我们自己创建的过滤器

public static void RegisterGlobalFilters(GlobalFilterCollection filters)

        {

            filters.Add(new HandleErrorAttribute());
   //我们自己的过滤器

            filters.Add(new SimpleMessageAttribute() { Message="Groupxz",Order=1});

        }

2.在Controller上现加上过滤器

[SimpleMessage(Message = "Controller", Order = 1)]

    public class AccountController : Controller

3.在Action上也加上属性

 [SimpleMessage(Message = "Action",Order=1)]

        public ActionResult LogOn()

大家想一下输出的结果?

结果如下:

Before Action: Groupxz]

[Before Action: Controller]

[Before Action: Action]

[After Action: Action]

[After Action: Controller]

[After Action: Groupxz] 

同学,你对了吗?相信更加了解了过滤器的执行顺序了吧!

一定要注意:

异常过滤器执行的顺序是相反的。如果异常过滤器适用于具有相同 控制器和行为方法,

行为方法上的过滤器将首先被执行。全局过滤器最后执行异常过滤器是和上面相同的。

对了,这里我也没有写实例了,可以去网上找找实例,如果找到实例,也给我完善一下!

---------------------------------------------------------------------

MVC框架提供了一些内置的过滤器,这是准备在应用中使用。如所示内置过滤器

RequireHttps 强制使用HTTPS协议的行动

OutputCache 缓存从一个动作方法输出

ValidateInput和ValidationAntiForgeryToken

与安全相关的授权过滤器

AsyncTimeout、NoAsyncTimeout使用异步控制器

ChildActionOnlyAttribute的授权过滤器,支持Html.Action

Html.RenderAction辅助方法

使用MVC3框架上自己的过滤器

OutputCache过滤器的参数请参考,msdn上的讲解

简单的实例:

[OutputCache(Duration = 30)]

public ActionResult ChildAction() {

Response.Write("Child action method is running: " + DateTime.Now);

return View();

}

总结:

在这一章中,你已经看到如何封装的逻辑地址作为过滤器的横切关注点。

我们向您展示了过滤器的不同类型以及如何实现他们。您看到了如何

过滤器作为控制器的属性和动作方法,以及他们如何可以用
全局过滤器。过滤器是一种扩展的逻辑,一个请求被处理时应用的手段。。。

在此,过滤器的了解基本讲完。。。下一章讲,控制器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息