快速业务通道

ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第六篇:******

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
;
7
8namespace MVCDemo.Controllers.Filters
9{
10  public class LoggerFilter : FilterAttribute, IActionFilter
11  {
12    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
13    {
14      filterContext.Controller.ViewData["ExecutingLogger"] = "正 要添加公告,已以写入日志!时间:" + DateTime.Now;
15    }
16
17    void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
18    {
19       filterContext.Controller.ViewData["ExecutedLogger"] = "公告添加完成,已以写入日志!时间:" + DateTime.Now;
20    }
21  }
22}

可以看到,这个类继承了FilterAttribute并实现了IActionFilter 。其中关键是IActionFilter,它有两个方法,OnActionExecuting在被拦截Action前执行,OnActionExecuted在被拦截Action后执行。两个方 法都有一个参数,虽然类型不同,但其实都是一个作用:被拦截Action的上下文。

这个地方我得解释一下,你******拦截了Action,在 做处理时难免要用到被拦截Action相关的东西,例如在我们的例子中,就需要想被拦截Action所在Controller的ViewData中添加内容,所以, ******方法有一个参数表示被拦截Action的上下文是顺理成章的事。

下面再看ExceptionFilter这个******,它是在Action出现异常时 发挥作用的。

ExceptionFilter.cs:

1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Web;
5using System.Web.Mvc;
6using System.Web.Mvc.Ajax;
7
8namespace MVCDemo.Controllers.Filters
9{
10  public class ExceptionFilter : FilterAttribute,IExceptionFilter
11   {
12    void IExceptionFilter.OnException(ExceptionContext filterContext)
13    {
14       filterContext.Controller.ViewData["ErrorMessage"] = filterContext.Exception.Message;
15       filterContext.Result = new ViewResult()
16      {
17        ViewName = "Error",
18         ViewData = filterContext.Controller.ViewData,
19      };
20       filterContext.ExceptionHandled = true;
21    }
22  }
23}

异常******一样需要继承 FilterAttribute,但是不要实现IActionFilter,而是要实现IExceptionFilter接口,这个接口只有一个方法:OnException,顾名思义,当然 是发生异常时被调用了。我们看看我让它做了什么:首先将异常信息(ExceptionContext一样也是上下文,而其成员的Exception就是一个 Exception类型的实例,就是被抛出的异常)记录到ViewData相应的键值里,然后我们要呈现Error这个视图。

注意!这里已经不是 Controller里了,而是另一个类,所以当然不能调用View方法返回ViewResult实例了。我们只好新建一个ViewResult实例,并将其视图名设为 Error,将上下文中的DataView传过去。

最后那行filterContext.ExcepitonHandled = true;很重要,这行的意思是告诉系统,异常已 经处理,不要再次处理了。

应用******

好了,******建立完了,要怎么应用到相应的Action上呢?如果你使用过Spring,你一 定对其AOP是实现之麻烦深有感触,如果你和我一样讨厌写各种XML的话,你真是太幸福了。因为在ASP.NET MVC中,应用拦截器简直是轻松加愉 快。只要将拦截器当做Attribute写在要应用此拦截器的Action上就行了。看代码。

AnnounceController.cs:

1using System;
2using System.Collections.Generic;
3using System.Linq;
4using

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号