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属性是设置在处理异常之后所要显示的视图名称。
来看示例:
示例还是接着上个篇幅的示例,没看过前篇的朋友也没什么影响很简单的示例。
代码1-2
public ActionResult Index()
{
int i = ;
int j = / i;
return View(_DataStandard.GetProducts());
}
首先我们在控制器的Index()方法中定义个错误处理,0是不能作为除数的处理到这必须报异常的。运行的结果如图1所示。
图1

很明确的报出了异常的所在,这是我们不希望的看见的,接下来我们把异常过滤器给使用上:
代码1-3
[HandleError]
public ActionResult Index()
{
int i = ;
int j = / i;
return View(_DataStandard.GetProducts());
}
这时你会发现运行的结果和图1中所示的一样,这是坑爹呢??!!!!当然不是我们需要在Web.config文件的中的<system.web>节点下做相对应的配置才可以,
代码1-4
<customErrors mode="On"" />
需要添加代码1-4中的内容到system.web节点下,这是我们再来看一下运行的结果图。
图2

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

到这里异常过滤器的基础使用也就讲解完毕了。还有一种结果过滤器就不做讲解了,基础结构和行为过滤器近乎相同使用方式也是,使用一下便知其用法。
作者:金源
出处:http://www.cnblogs.com/jin-yuan/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面
ASP.NET MVC 过滤器(五)的更多相关文章
- ASP.NET MVC 视图(五)
ASP.NET MVC 视图(五) 前言 上篇讲解了视图中的分段概念.和分部视图的使用,本篇将会对Razor的基础语法简洁的说明一下,前面的很多篇幅中都有涉及到视图的调用,其中用了很多视图辅助器,也就 ...
- ASP.NET MVC 路由(五)
ASP.NET MVC 路由(五) 前言 前面的篇幅讲解了MVC中的路由系统,只是大概的一个实现流程,让大家更清晰路由系统在MVC中所做的以及所在的位置,通过模糊的概念描述.思维导图没法让您看到路由的 ...
- ASP.NET MVC 过滤器(一)
ASP.NET MVC 过滤器(一) 前言 前面的篇幅中,了解到了控制器的生成的过程以及在生成的过程中的各种注入点,按照常理来说篇幅应该到了讲解控制器内部的执行过程以及模型绑定.验证这些知识了.但是呢 ...
- ASP.NET MVC 过滤器(三)
ASP.NET MVC 过滤器(三) 前言 本篇讲解行为过滤器的执行过程,过滤器实现.使用方式有AOP的意思,可以通过学习了解过滤器在框架中的执行过程从而获得一些AOP方面的知识(在顺序执行的过程中, ...
- ASP.NET MVC 过滤器(四)
ASP.NET MVC 过滤器(四) 前言 前一篇对IActionFilter方法执行过滤器在框架中的执行过程做了大概的描述,本篇将会对IActionFilter类型的过滤器使用来做一些介绍. ASP ...
- ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)
上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...
- (转)ASP.NET MVC 第五个预览版和表单提交场景
转自:http://ourlife.blog.51cto.com/708821/296171 上个星期四,ASP.NET MVC开发团队发布了ASP.NET MVC框架的“第五个预览版”.你可以在这里 ...
- Asp.net Mvc 过滤器执行顺序
Asp.net Mvc 过滤器执行顺序: IAuthorizationFilter(OnAuthorization)----->IActionFilter(OnActionExecuting)- ...
- ASP.NET MVC过滤器(一)
MVC过滤器是加在 Controller 或 Action 上的一种 Attribute,通过过滤器,MVC 网站在处理用户请求时,可以处理一些附加的操作,如:用户权限验证.系统日志.异常处理.缓存等 ...
随机推荐
- 安装SVN客户端重启电脑之后,右键未出现SVN选项的原因
今天安装SVN客户端明明安装成功,电脑也重启过了,但是就是在右键里找不到SVN,百度了很久,删注册表.建用户组之类的方法都试过了,但是都没有效果. 后来才找到真正的原因,我的安装包是32位的,系统是6 ...
- 嵌入式Linux学习入门:控制LED灯
记录自己linux学习过程,让自己能够一直坚持下去 1.原理图分析: nLED_1, nLED_2, nLED_4, 给低电平则对应LED灯亮,高电平则对应LED灯灭, S3C2440芯片GPF4-G ...
- 常用CSS缩写语法总结
使用缩写可以帮助减少你CSS文件的大小,更加容易阅读.css缩写的主要规则如下: 颜色 16进制的色彩值,如果每两位的值相同,可以缩写一半,例如:#000000可以缩写为#000;#336699可以缩 ...
- 测试--jmeter的使用
jmeter用于压力测试 首先我们要区别压力和攻击,当设立了不适当的线程数量和准备时长,就容易造成攻击. 线程数:虚拟用户数.一个虚拟用户占用一个进程或线程.设置多少虚拟用户数在这里也就是设置多少个线 ...
- MYSQL数据库------操作命令笔记
一.数据库连接 * 连接数据库命令(前提需要安装mysq ): mysql -h hostIp -u userName -pPassWord 二.数据库操作 * 查看所有数据库: show datab ...
- 【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 数位DP
[BZOJ1662][Usaco2006 Nov]Round Numbers 圆环数 Description 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁 ...
- KMP匹配算法 - Number Sequence
Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M ...
- [翻译svg教程]svg 中的g元素
svg 中的<g>元素用来组织svg元素.如果一组svg元素被g元素包裹了,你可以通过对g元素进行变换(transform),被g元素包裹的元素也将被变换,就好这些被svg包裹的元素是一个 ...
- postman 断言解析
最近在学习postman官方文档, 顺势翻译出来,以供学习! postman断言是JavaScript语言编写的,在postman客户端指定区域编写即可. 断言会在请求返回之后,运行,并根据断言的pa ...
- 解决overflow:hidden在安卓微信页面没有效果的办法
在做h5移动端时候,发现overflow: hidden;在安卓微信页面失效问题,经研究和实验,用第三种方法和第四种方法可以解决! 1.完全隐藏 在<boby>里加入scroll=&quo ...