博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET MVC 过滤器(五)
阅读量:5228 次
发布时间:2019-06-14

本文共 3989 字,大约阅读时间需要 13 分钟。

 

ASP.NET MVC 过滤器(五)

前言

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

 

ASP.NET MVC过滤器

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

 

异常过滤器的使用

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

public interface IExceptionFilter    {        void OnException(ExceptionContext filterContext);    }

IExceptionFilter接口类型是异常过滤器必须实现的接口。当然了还有FilterAttribute特性类型这是必需要实现的。

在此不正确FilterAttribute特性类型做什么介绍。

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

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

代码1-1

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属性是设置在处理异常之后所要显示的视图名称。

来看演示样例:

演示样例还是接着上个篇幅的演示样例。没看过前篇的朋友也没什么影响非常easy的演示样例。

代码1-2

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

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

图1

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

代码1-3

[HandleError]        public ActionResult Index()        {            int i = 0;            int j = 3 / i;            return View(_DataStandard.GetProducts());           }

这时你会发现执行的结果和图1中所看到的的一样,这是坑爹呢??!。!

!当然不是我们须要在Web.config文件的中的<system.web>节点下做相相应的配置才干够。

代码1-4

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

图2

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

代码1-5

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
(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:

@model HandleErrorInfo@{    ViewBag.Title = "Error";}

Error

异常类型:@Model.Exception.GetType().Name 异常所在控制器:@Model.ControllerName 异常所在控制器行为:@Model.ActionName

具体信息:@Model.Exception.Message

如今我们改动一下代码1-3中的所使用的过滤器,改动为我们代码1-5中定义的自己定义类型。再看一下执行结果:

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

 

 

 

 

作者:

转载于:https://www.cnblogs.com/mfrbuaa/p/5078146.html

你可能感兴趣的文章
评价意见整合
查看>>
二、create-react-app自定义配置
查看>>
Android PullToRefreshExpandableListView的点击事件
查看>>
系统的横向结构(AOP)
查看>>
linux常用命令
查看>>
NHibernate.3.0.Cookbook第四章第6节的翻译
查看>>
使用shared memory 计算矩阵乘法 (其实并没有加速多少)
查看>>
Django 相关
查看>>
git init
查看>>
训练记录
查看>>
IList和DataSet性能差别 转自 http://blog.csdn.net/ilovemsdn/article/details/2954335
查看>>
Hive教程(1)
查看>>
第16周总结
查看>>
C#编程时应注意的性能处理
查看>>
Fragment
查看>>
比较安全的获取站点更目录
查看>>
苹果开发者账号那些事儿(二)
查看>>
使用C#交互快速生成代码!
查看>>
UVA11374 Airport Express
查看>>
P1373 小a和uim之大逃离 四维dp,维护差值
查看>>