ASP.NET MVC 过滤器(五)

前言

上篇对了行为过滤器的使用做了讲解,如果在控制器行为的执行中遇到了异常怎么办呢?没关系,还好框架给我们提供了异常过滤器,在本篇中将会对异常过滤器的使用做一个大概的讲解。

ASP.NET MVC过滤器

  • 过滤器在系统框架中的整体对象模型
  • IAuthorizationFilter授权认证过滤器的执行过程
  • 使用IAuthorizationFilter过滤器
  • IActionFilter行为过滤器的执行过程
  • 自定义实现IActionFilter行为过滤器
  • 异常过滤器的使用

异常过滤器的使用

在使用异常过滤器之前,我们要看一下它们的结构:

  1. public interface IExceptionFilter
  2. {
  3. void OnException(ExceptionContext filterContext);
  4. }

IExceptionFilter接口类型是异常过滤器必须实现的接口,当然了还有FilterAttribute特性类型这是必须要实现的。在此不对FilterAttribute特性类型做什么介绍。

我们看一下IExceptionFilter接口类型中的OnException()方法中的有个ExceptionContext类型的参数,ExceptionContext类型是遗产过滤器参数上下文对象,继承自ControllerContext类型,这种编程模式在MVC框架中随处可见了不做多的解释了。

在MVC框架中给我们默认的提供了一个异常过滤器类型:

代码1-1

  1. public class HandleErrorAttribute : FilterAttribute, IExceptionFilter
  2. {
  3. // 摘要:
  4. // 初始化 System.Web.Mvc.HandleErrorAttribute 类的新实例。
  5. public HandleErrorAttribute();
  6. public Type ExceptionType { get; set; }
  7. public string Master { get; set; }
  8. public string View { get; set; }
  9. public virtual void OnException(ExceptionContext filterContext);
  10. }

ExceptionType属性对应要处理的异常类型,如果设置某种异常类型值那么异常过滤器只会针对这个类型的异常来进行做处理,默认值是处理所有异常类型。

Master属性则是设置在处理异常之后所要显示视图所用的布局。

View属性是设置在处理异常之后所要显示的视图名称。

来看示例:

示例还是接着上个篇幅的示例,没看过前篇的朋友也没什么影响很简单的示例。

代码1-2

  1. public ActionResult Index()
  2. {
  3. int i = ;
  4. int j = / i;
  5. return View(_DataStandard.GetProducts());
  6. }

首先我们在控制器的Index()方法中定义个错误处理,0是不能作为除数的处理到这必须报异常的。运行的结果如图1所示。

图1

很明确的报出了异常的所在,这是我们不希望的看见的,接下来我们把异常过滤器给使用上:

代码1-3

  1. [HandleError]
  2. public ActionResult Index()
  3. {
  4. int i = ;
  5. int j = / i;
  6. return View(_DataStandard.GetProducts());
  7. }

这时你会发现运行的结果和图1中所示的一样,这是坑爹呢??!!!!当然不是我们需要在Web.config文件的中的<system.web>节点下做相对应的配置才可以,

代码1-4

  1. <customErrors mode="On"" />

需要添加代码1-4中的内容到system.web节点下,这是我们再来看一下运行的结果图。

图2

为什么会显示这个页面,这跟HandleErrorAttribute类型中的OnException(ExceptionContext filterContext)方法默认实现有关系,它默认设置就是服务器错误信息,那我们怎么自定义的指定我们想显示的页面,或者是看到我们想详细看到的错误信息呢?我们再来重写一下OnException()方法吧。

代码1-5

  1. public class MyCustomHandleErrorAttribute : HandleErrorAttribute
  2. {
  3. public override void OnException(ExceptionContext filterContext)
  4. {
  5. if (filterContext == null)
  6. {
  7. throw new ArgumentNullException("filterContext");
  8. }
  9. if (filterContext.Exception!=null)
  10. {
  11. Exception innerException = filterContext.Exception;
  12. if (!filterContext.ExceptionHandled)
  13. {
  14. string controllerName = (string)filterContext.RouteData.Values["controller"];
  15. string actionName = (string)filterContext.RouteData.Values["action"];
  16. HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
  17. ViewResult result = new ViewResult
  18. {
  19. ViewName = "Error",
  20. MasterName = this.Master,
  21. ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
  22. TempData = filterContext.Controller.TempData
  23. };
  24. filterContext.Result = result;
  25. filterContext.ExceptionHandled = true;
  26. }
  27. }
  28.  
  29. }
  30. }

在上面的MyCustomHandleErrorAttribute类型实现中,我们只需要关注ExceptionContext filterContext参数中的Result的设置,在代码1-5中我们指定了Error这个视图,并且还实例化了HandleErrorInfo类型作为视图模型传递到视图中,我们现在要新建一个视图,在当前控制器的文件夹下View/[controllername]/Error.cshtml新建这个视图文件,并且选择为强类型视图,类型则为HandleErrorInfo类型,我们看一下视图的定义。

代码1-6:

  1. @model HandleErrorInfo
  2. @{
  3. ViewBag.Title = "Error";
  4. }
  5. <h2>
  6. Error</h2>
  7. <p>
  8. 异常类型:<b>@Model.Exception.GetType().Name</b>
  9. 异常所在控制器:<b>@Model.ControllerName</b>
  10. 异常所在控制器行为:<b>@Model.ActionName</b>
  11. </p>
  12. <p>
  13. 详细信息:<b>@Model.Exception.Message</b>
  14. </p>

现在我们修改一下代码1-3中的所使用的过滤器,修改为我们代码1-5中定义的自定义类型,再看一下运行结果:

到这里异常过滤器的基础使用也就讲解完毕了。还有一种结果过滤器就不做讲解了,基础结构和行为过滤器近乎相同使用方式也是,使用一下便知其用法。

作者:金源

出处:http://www.cnblogs.com/jin-yuan/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

ASP.NET MVC 过滤器(五)的更多相关文章

  1. ASP.NET MVC 视图(五)

    ASP.NET MVC 视图(五) 前言 上篇讲解了视图中的分段概念.和分部视图的使用,本篇将会对Razor的基础语法简洁的说明一下,前面的很多篇幅中都有涉及到视图的调用,其中用了很多视图辅助器,也就 ...

  2. ASP.NET MVC 路由(五)

    ASP.NET MVC 路由(五) 前言 前面的篇幅讲解了MVC中的路由系统,只是大概的一个实现流程,让大家更清晰路由系统在MVC中所做的以及所在的位置,通过模糊的概念描述.思维导图没法让您看到路由的 ...

  3. ASP.NET MVC 过滤器(一)

    ASP.NET MVC 过滤器(一) 前言 前面的篇幅中,了解到了控制器的生成的过程以及在生成的过程中的各种注入点,按照常理来说篇幅应该到了讲解控制器内部的执行过程以及模型绑定.验证这些知识了.但是呢 ...

  4. ASP.NET MVC 过滤器(三)

    ASP.NET MVC 过滤器(三) 前言 本篇讲解行为过滤器的执行过程,过滤器实现.使用方式有AOP的意思,可以通过学习了解过滤器在框架中的执行过程从而获得一些AOP方面的知识(在顺序执行的过程中, ...

  5. ASP.NET MVC 过滤器(四)

    ASP.NET MVC 过滤器(四) 前言 前一篇对IActionFilter方法执行过滤器在框架中的执行过程做了大概的描述,本篇将会对IActionFilter类型的过滤器使用来做一些介绍. ASP ...

  6. ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)

    上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...

  7. (转)ASP.NET MVC 第五个预览版和表单提交场景

    转自:http://ourlife.blog.51cto.com/708821/296171 上个星期四,ASP.NET MVC开发团队发布了ASP.NET MVC框架的“第五个预览版”.你可以在这里 ...

  8. Asp.net Mvc 过滤器执行顺序

    Asp.net Mvc 过滤器执行顺序: IAuthorizationFilter(OnAuthorization)----->IActionFilter(OnActionExecuting)- ...

  9. ASP.NET MVC过滤器(一)

    MVC过滤器是加在 Controller 或 Action 上的一种 Attribute,通过过滤器,MVC 网站在处理用户请求时,可以处理一些附加的操作,如:用户权限验证.系统日志.异常处理.缓存等 ...

随机推荐

  1. ChannelHandler

    ChannelHandler功能介绍 ChannelHandler类似于Servlet的Filter过滤器,负责对I/O事件或者I/O操作进行拦截和处理,它可以选择性地拦截和处理自己感兴趣的事件,也可 ...

  2. Codeforces CF#628 Education 8 D. Magic Numbers

    D. Magic Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  3. asp.net,cookie,写cookie,取cookie

    Cookie是一段文本信息,在客户端存储 Cookie 是 ASP.NET 的会话状态将请求与会话关联的方法之一.Cookie 也可以直接用于在请求之间保持数据,但数据随后将存储在客户端并随每个请求一 ...

  4. SQL Server 2008 表变量 临时表

    最近做一个报表,其中 在报表中用到了存储过程,游标,cte表达式,临时表和表变量. 在游标中循环遍历cte中的数据,把对应的数据存放在变量里面,之后把变量插入到表变量中,游标结束后,想要根据存储过程的 ...

  5. 服务器使用FTP命令行 无法传送文件 卡在150 Opening data channel for file transfer

    猜测,是因FTP服务器采用了主动模式,在创建数据传输通道时,服务器会以一个随机的端口,连接回来. 临时解决方案: 因不知道请求回来使用的哪个段的端口,因此,暂时关闭了防火墙.即能正常传输文件了.

  6. Ubuntu14.10搭建C++开发环境

    方法一:1、安装Eclipsesudo apt-get install eclipse2、安装Eclipse CDTsudo apt-get install eclipse-cdt3、安装Autoto ...

  7. MAC系统设置SSX教程与下载

    http://ss.hongxingchajian.com MAC系统设置SSX教程与下载 1.下载客户端并安装,装完后打开 链接: http://pan.baidu.com/s/1o7ypp5g 密 ...

  8. <十六>JDBC_使用 DBUtils 编写通用的DAO

    接口 : DAO<T>.java import java.sql.Connection;import java.sql.SQLException;import java.util.List ...

  9. SpringMVC4 实例

    之前我先创建普通web项目,再直接添加maven框架.结果springMVC框架一直不能正确的访问控制器. 但通过以下方式创建maven web项目就能获得正确的架构路径. 1.新建一个maven项目 ...

  10. SMA、SMB、SMC封装的二极管

    以常见的贴片肖特基二极管SS14 SS24 SS34为例,三种管子区别主要在电流上,有三种封装:SMA.SMB.SMC. 从成本和体积来说,优先选用最小尺寸的SMA/DO-214AC封装,其他封装一般 ...