ASP.NET MVC 过滤器(五)

简介:

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

<customErrors  mode="On"" />

须要加入代码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<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:

复制代码
@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中定义的自己定义类型。再看一下执行结果:

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

 

 

 

 

作者:金源

相关文章
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
38 7
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
53 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
46 0
|
3月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
3月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
119 0
|
前端开发 .NET 开发框架
ASP.NET MVC 重点教程一周年版 第六回 过滤器Filter
在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能 判断登录与否或用户权限 决策输出缓存 防盗链 防蜘蛛 本地化与国际化设置  实现动态Action Filter是一种声明式编程方式,在Asp.net MVC中它只能限制于Action(或它的Controller)。
841 0
|
6月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
189 0
|
6月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
78 0
|
6月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
324 5
|
6月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界