当前位置: 首页 > news >正文

ASP.NET MVC 过滤器(五)


ASP.NET MVC 过滤器(五)

前言

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

 

ASP.NET MVC过滤器

  • 过滤器在系统框架中的整体对象模型

  • IAuthorizationFilter授权认证过滤器的执行过程

  • 使用IAuthorizationFilter过滤器

  • IActionFilter行为过滤器的执行过程

  • 自定义实现IActionFilter行为过滤器

  • 异常过滤器的使用

 

异常过滤器的使用

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

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

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

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

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

代码1-1

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

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

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

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

来看示例:

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

代码1-2

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

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

图1

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

代码1-3

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

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

代码1-4

1
< customErrors   mode = "On" " />

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

图2

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

代码1-5

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

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

代码1-6:

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

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

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

 

 


     本文转自jinyuan0829 51CTO博客,原文链接:http://blog.51cto.com/jinyuan/1427936,如需转载请自行联系原作者





相关文章:

  • 设置隐式动画播放时间
  • Linux的企业-Hadoop的多节点配置
  • IP地址的正则表达式
  • [CTO札记]盛大文学公司名称对联
  • Linux 各文件夹作用
  • Groundwork:响应式 HTML5,CSS JavaScript 工具包
  • 主机安全检测nessus的安装以及配置
  • Android应用程序组件Content Provider的启动过程源代码分析(7)
  • ipv6
  • Docker--------registry私有仓库搭建 [ Http ]
  • 实战:Windows Server 2008 活动目录 传送和争夺操作主控角色
  • AIX 5.3 Install Oracle 10g RAC 错误集锦--9i RAC present
  • All Our N-gram are Belong to You
  • 域用户权限|运行软件
  • 使用GitHub进行版本管理
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • Android Volley源码解析
  • Angular Elements 及其运作原理
  • canvas 高仿 Apple Watch 表盘
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • EventListener原理
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Python_OOP
  • React-redux的原理以及使用
  • Shell编程
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • ubuntu 下nginx安装 并支持https协议
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 创建一种深思熟虑的文化
  • 官方解决所有 npm 全局安装权限问题
  • 如何解决微信端直接跳WAP端
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $jQuery 重写Alert样式方法
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)计算机毕业设计ssm电影分享网站
  • (三十五)大数据实战——Superset可视化平台搭建
  • (十一)图像的罗伯特梯度锐化
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)http-server应用
  • .naturalWidth 和naturalHeight属性,
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Reactor简单使用教程
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET/C# 使用反射注册事件
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET导入Excel数据
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET正则基础之——正则委托