Asp.Net MVC学习总结之过滤器详解(4)

@model HandleErrorInfo <!DOCTYPE html> <html> <head> <meta content="width=device-width" /> <title>SpecialError</title> </head> <body> <div> <p> There was a<b>@Model.Exception.GetType().Name</b> while rendering<b>@Model.ControllerName</b>'s <b>@Model.ActionName</b> action </p> </div> </body> </html>

运行结果如下:

创建自定义的异常过滤器

如果我们对异常过滤器有特殊的需求,可以通过自定义的异常过滤器来完成,创建自定义异常过滤器必须实现IExceptionFilter接口,该接口代码如下:

Asp.Net MVC学习总结之过滤器详解

当一个未知处理异常发生时,OnException方法会被调用。该方法的传递一个ExceptionContext对象,派生于ControllerContext类,定义了一些额外的过滤器专有属性如下表所示:

Asp.Net MVC学习总结之过滤器详解

抛出的异常通过Exception属性是可以访问的。通过把ExceptionHandled属性设置为true,一个异常过滤器可以报告它已经处理了该异常,应用于一个动作的所有异常过滤器都会被调用。

需要注意的是:如果一个动作方法的所有异常过滤器均为把ExceptionHandled属性设置为true,MVC框架将使用默认的ASP.NET异常处理程序。

Result属性有异常过滤器使用,以告诉MVC框架要做什么,异常过滤器的两个主要应用是记录该异常到日志,并把适当的消息显示给用户。下面的代码将演示通过创建一个自定义的异常过滤器,当一个特定的钟类的未处理异常出现时,把该用户重定向到一个指定的错误页面。

public class MyExectionAttribute:FilterAttribute,IExceptionFilter { public void OnException(ExceptionContext filterContext) { if(!filterContext.ExceptionHandled&& filterContext.Exception is NullReferenceException) { filterContext.Result = new RedirectResult("~/Content/SpecialErrorPage.html"); filterContext.ExceptionHandled = true; } } }

然后在项目根目录添加一个名为Content的文件夹,在该文件夹下创建SpeciErrorPage.html文件,当异常被处理时,将以这个错误页面显示个用户。该页面代码如下:

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <h1>Sorry</h1> <p>this is a Excetption test</p> There was aNullReferenceException while renderingHome's Index action </body> </html>

在控制器中应用MyExection异常过滤器,并主动让其抛出一个空引用异常,以便测试。

public class HomeController : Controller { [MyExection] public ActionResult Index() { throw new NullReferenceException(); } }

运行结果如下:

Asp.Net MVC学习总结之过滤器详解

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdpszj.html