网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > .Net编程 > 正文

简单实现.netMVC自定义错误处理页面

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

ASP.NET MVC中,我们可以使用HandleErrorAttribute特性来具体指定如何处理Action抛出的异常.只要某个Action设置了HandleErrorAttribute特性,那么默认的,当这个Action抛出了异常时MVC将会显示Error视图,该视图位于~/Views/Shared目录下.

设置HandleError属性

可以通过设置下面这些属性来更改HandleErrorAttribute特性的默认处理:

ExceptionType.指定过滤器处理那种或哪些类型的异常,如果没有指定该属性,过滤器将会处理所有的异常.
View.指定发生异常时过滤器要显示的视图名称.
Master.指定视图母版的名称,如果有的话.
Order.指定过滤器应用的顺序,如果一个Action有多个HandleErrorAttribute过滤器.
指定Order属性

如果某个Action设置了多个HandleErrorAttribute,Order属性可以用来确定使用哪个过滤器.其值可以设置为从-1(最高优先级)到任何正整数之间的整数来标识其优先级,值越大,优先级别越低.Order属性遵循以下规则:

应用到Controller上的过滤器将会自动应用到该Controller的所有Action上.

如果Controller和Action都应用了HandleErrorAttribute,那么只要Order属性值相同,将会先执行Controller上的过滤器,而后才会执行Action上的过滤器.

对于相同Order属性的过滤器,其执行先后次序不定.

如果没有指定Order属性,则默认为-1,这意味着该过滤器将比其他的过滤器优先执行,除非其他过滤器指定了Order为-1.

如果有多个过滤器可适用,那么第一个可以处理该异常的过滤器会被首先调用,然后针对该异常的处理将会终结.
在View中获取异常信息

ASP.NET MVC框架将异常信息存储在ViewDataDictionary中来传递给Error视图,该ViewDataDictionary的Model属性即是ExceptionContext类的一个实例,这个ViewData有下面几个键:

ActionName:目标Action方法的名称
ControllerName:目标Controller的名称
Exception:异常对象.

启用自定义错误处理

下面我们来开启用于HandleErrorAttribute过滤器的自定义错误处理,打开程序的Web.config文件,在system.web节中加入一个customErrors元素,如下所示

  1. <system.web> 
  2.   <customErrors mode="On" defaultRedirect="Error" /> 
  3. </system.web> 

处理Error视图中的错误

有时候在Error视图中也会发生错误,这时ASP.NET将会显示其默认的错误页面(黄底红字),为了避免这种情况的出现,我们在Web.config文件的customErrors节中来自定义错误页面,如下:

  1. <system.web> 
  2.   <customErrors mode="On" defaultRedirect="GenericErrorPage.htm"> 
  3.     <error statusCode="500" redirect="/Error.htm" /> 
  4.   </customErrors> 
  5. </system.web> 

示例程序

下面的示例说明了如何对Controller和Action应用HandleErrorAttribute特性来自定义异常处理.

示例中HomeController有一个名为ThrowException的Action方法,在该Action中将会抛出一个ApplicationException类型的错误,这个Action应用了HandleErrorAttribute,但是没有设置任何参数.当该Action执行时将会抛出一个异常,显示默认的Error视图.

而ThrowNotImplemented方法则应用了设有两个参数的HandleErrorAttribute,View参数指定了自定义的Error视图名称:CustomErrorView,ExceptionType参数指定了该过滤器仅处理ThrowNotImplemented类型的异常.

Controller的HandleErrorAttribute则设置了Order参数为2,意味着该过滤器只会被在Index或About方法产生异常时执行.


同时示例给出了视图CustomErrorView和CustomError.Master的内容.
视图CustomErrorView显示异常的信息,比如抛出异常的Controller和Action的名称,异常的内容以及堆栈跟踪信息.
视图Index上有两个链接,分别指向了ThrowException和ThrowNotImplemented两个Action.

HomeController类

  1. [HandleError(Order = 2)] 
  2. public class HomeController : Controller 
  3.     public ActionResult Index() 
  4.     { 
  5.         ViewData["Message"] = "Welcome to ASP.NET MVC!"
  6.  
  7.         return View(); 
  8.     } 
  9.  
  10.     public ActionResult About() 
  11.     { 
  12.         return View(); 
  13.     } 
  14.  
  15.     [HandleError] 
  16.     public ActionResult ThrowException() 
  17.     { 
  18.         throw new ApplicationException(); 
  19.     } 
  20.  
  21.     [HandleError(View = "CustomErrorView", ExceptionType = typeof(NotImplementedException))] 
  22.     public ActionResult ThrowNotImplemented() 
  23.     { 
  24.         throw new NotImplementedException(); 
  25.     } 

视图 CustomErrorView

  1. <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
  2.     CustomErrorView 
  3. </asp:Content> 
  4.  
  5. <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
  6.  
  7.     <h2>CustomErrorView</h2> 
  8.     <p> 
  9.       Controller: <%=((HandleErrorInfo)ViewData.Model).ControllerName %> 
  10.     </p> 
  11.     <p> 
  12.       Action: <%=((HandleErrorInfo)ViewData.Model).ActionName %> 
  13.     </p> 
  14.     <p> 
  15.       Message: <%=((HandleErrorInfo)ViewData.Model).Exception.Message %> 
  16.     </p> 
  17.     <p> 
  18.       Stack Trace: <%=((HandleErrorInfo)ViewData.Model).Exception.StackTrace %> 
  19.     </p> 
  20.  
  21. </asp:Content> 

视图 Index

  1. <asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server"> 
  2.     Home Page 
  3. </asp:Content> 
  4.  
  5. <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> 
  6.     <h2><%= Html.Encode(ViewData["Message"]) %></h2> 
  7.     <%= Html.ActionLink("Throw An Exception", "ThrowException")%> (Default Error Page) 
  8.     <br /><br /> 
  9.     <%= Html.ActionLink("Throw Not Implemented Exception", "ThrowNotImplemented")%> (Custom Error Page) 
  10.  
  11. </asp:Content>  

母版页 CustomError.Master

  1. <%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %> 
  2.  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  4. <html xmlns="http://www.w3.org/1999/xhtml" > 
  5. <head runat="server"> 
  6. <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title> 
  7. <link href="http://www.cnblogs.com/Content/Site.css" rel="stylesheet" type="text/css" /> 
  8. <style type="text/css"> 
  9. body.error 
  10. background-color: Maroon; 
  11. color: #696969; 
  12. </style> 
  13. </head> 
  14. <body class="error"> 
  15. <div class="page"> 
  16. <div id="header"> 
  17. <div id="title"> 
  18. <h1>A Custom Error Occurred</h1> 
  19. </div> 
  20.  
  21. <div id="logindisplay"> 
  22. <% Html.RenderPartial("LogOnUserControl"); %> 
  23. </div> 
  24.  
  25. <div id="menucontainer"> 
  26.  
  27. <ul id="menu"> 
  28. <li><%= Html.ActionLink("Home", "Index", "Home")%></li> 
  29. <li><%= Html.ActionLink("About", "About", "Home")%></li> 
  30. </ul> 
  31.  
  32. </div> 
  33. </div> 
  34. <div id="main"> 
  35. <asp:ContentPlaceHolder ID="MainContent" runat="server" /> 
  36. <div id="footer"> 
  37. </div> 
  38. </div> 
  39. </div> 
  40. </body> 
  41. </html>  
  • 上一篇资讯: ListView经典使用技巧
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师