ASP.NET MVC 过滤器(五)

时间:2021-08-16 10:10:35

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

ASP.NET MVC 过滤器(五)

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

代码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

ASP.NET MVC 过滤器(五)

为什么会显示这个页面,这跟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中定义的自定义类型,再看一下运行结果:

ASP.NET MVC 过滤器(五)

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

作者:金源

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

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

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

  1. ASP&period;NET MVC 视图&lpar;五&rpar;

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

  2. ASP&period;NET MVC 路由&lpar;五&rpar;

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

  3. ASP&period;NET MVC 过滤器&lpar;一&rpar;

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

  4. ASP&period;NET MVC 过滤器&lpar;三&rpar;

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

  5. ASP&period;NET MVC 过滤器&lpar;四&rpar;

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

  6. ASP&period;NET没有魔法——ASP&period;NET MVC 过滤器&lpar;Filter&rpar;

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

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

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

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

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

  9. ASP&period;NET MVC过滤器(一)

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

随机推荐

  1. 用Java实现网络爬虫

    myCrawler.java package WebCrawler; import java.io.File; import java.util.ArrayList; import java.util ...

  2. 【接上一篇】winform中dataGridView高度和宽度自适应填充完数据的高度和宽度,即dataGridView根据数据自适应大小

    上一篇:winform中dataGridView高度自适应填充完数据的高度 winform中dataGridView高度自适应填充完数据的高度,就是dataGridView自身不产生滚动条,自己的高度 ...

  3. java加密解密的学习

    注:此文章只是对如何学习java加密解密技术做一个讲解.并不涉及具体的知识介绍,如果有需要请留言,有时间我补冲长.个人觉着学习一个学习方法比学习一个知识点更有价值的多. 首先,对于加密解密知识体系没有 ...

  4. &lbrack;STOI2014&rsqb;舞伴&lpar;dp&rpar;

    STOI是汕头OI...无聊翻到了去年的比赛题目,就写然后自己测了一下. 其实我很想吐槽为什么题目名是perm,perm好像和舞伴完全无关.. dp(x,s)=∑dp(x-1,s-{i}))(0&lt ...

  5. CSS3 Media Queries 详细介绍与使用方法

    Media Queries 就是要在支援CSS3 的浏览器中才能正常工作,IE8 以下不支持. 而Media Queries 的套用方法千变万化,要套用在什么样的装置中,都可以自己来定义. 到底什么是 ...

  6. Linux-tar命令&lpar;2&rpar;

    tar 用于可以为文件和目录创建档案.可以为某一特定文件打包(备份文件), 也可以在档案中改变文件,或者向档案中加入新的文件. 主选参数: 主选参数仅能存在一个!不可同时存在!因为不可能同时压缩与解压 ...

  7. Msys&plus;MinGW编译VLC

      说明:本文只是对官方文档进行简单的翻译总结,旨在帮助一些英文不太好的朋友.官方文档请见wiki.videolan.org/Win32CompileMSYSNew. Msys是MinGW的一个辅助工 ...

  8. Git里有些费解的术语和设计

    关于暂存区, 好几个地方都写到了 正在编辑的文件 --> Unchacked/Modified, 而Unchacked/Modified, 的状态也可以叫 to be committed . 这 ...

  9. kafka&plus;storm结合存在的一些问题与解决方法

    在配置kafka和storm的时候, 经常的会出现一些问题, 主要在以下几个: 1.  打jar包上去storm集群的时候会出现jar包冲突,类似于log4j或者sf4j的报错信息. 2. kafka ...

  10. Clone of COCO API

    Clone of COCO API - Dataset @ http://cocodataset.org/ - with changes to support Windows build and py ...