ASP.net MVC自定义错误处理页面

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

      在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属性遵循以下规则:

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

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

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

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

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

在View中获取异常信息

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

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

启用自定义错误处理

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

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

 

处理Error视图中的错误

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

< system.web >
  
< customErrors  mode ="On"  defaultRedirect ="GenericErrorPage.htm" >
    
< error  statusCode ="500"  redirect ="/Error.htm"   />
  
</ customErrors >
</ 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类

[HandleError(Order  =   2 )]
public   class  HomeController : Controller
{
    
public  ActionResult Index()
    {
        ViewData[ " Message " =   " Welcome to ASP.NET MVC! " ;

        
return  View();
    }

    
public  ActionResult About()
    {
        
return  View();
    }

    [HandleError]
    
public  ActionResult ThrowException()
    {
        
throw   new  ApplicationException();
    }

    [HandleError(View  =   " CustomErrorView " , ExceptionType  =   typeof (NotImplementedException))]
    
public  ActionResult ThrowNotImplemented()
    {
        
throw   new  NotImplementedException();
    }
}



视图 CustomErrorView

< asp:Content  ID ="Content1"  ContentPlaceHolderID ="TitleContent"  runat ="server" >
    CustomErrorView
</ asp:Content >

< asp:Content  ID ="Content2"  ContentPlaceHolderID ="MainContent"  runat ="server" >

    
< h2 > CustomErrorView </ h2 >
    
< p >
      Controller:  <% = ((HandleErrorInfo)ViewData.Model).ControllerName  %>
    
</ p >
    
< p >
      Action:  <% = ((HandleErrorInfo)ViewData.Model).ActionName  %>
    
</ p >
    
< p >
      Message:  <% = ((HandleErrorInfo)ViewData.Model).Exception.Message  %>
    
</ p >
    
< p >
      Stack Trace:  <% = ((HandleErrorInfo)ViewData.Model).Exception.StackTrace  %>
    
</ p >

</ asp:Content >

 

视图 Index

< asp:Content  ID ="indexTitle"  ContentPlaceHolderID ="TitleContent"  runat ="server" >
    Home Page
</ asp:Content >

< asp:Content  ID ="indexContent"  ContentPlaceHolderID ="MainContent"  runat ="server" >
    
< h2 > <% =  Html.Encode(ViewData[ " Message " ])  %> </ h2 >
    
<% =  Html.ActionLink( " Throw An Exception " " ThrowException " ) %>  (Default Error Page)
    
< br  />< br  />
    
<% =  Html.ActionLink( " Throw Not Implemented Exception " " ThrowNotImplemented " ) %>  (Custom Error Page)

</ asp:Content >  

 

母版页 CustomError.Master

<% @ Master Language = " C# "  Inherits = " System.Web.Mvc.ViewMasterPage "   %>

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html  xmlns ="http://www.w3.org/1999/xhtml"   >
< head  runat ="server" >
< title >< asp:ContentPlaceHolder  ID ="TitleContent"  runat ="server"   /></ title >
< link  href ="http://www.cnblogs.com/Content/Site.css"  rel ="stylesheet"  type ="text/css"   />
< style  type ="text/css" >
body.error
{
background-color :  Maroon ;
color :  #696969 ;
}
</ style >
</ head >
< body  class ="error" >
< div  class ="page" >
< div  id ="header" >
< div  id ="title" >
< h1 > A Custom Error Occurred </ h1 >
</ div >

< div  id ="logindisplay" >
<%  Html.RenderPartial( " LogOnUserControl " );  %>
</ div >

< div  id ="menucontainer" >

< ul  id ="menu" >
< li > <% =  Html.ActionLink( " Home " " Index " " Home " ) %> </ li >
< li > <% =  Html.ActionLink( " About " " About " " Home " ) %> </ li >
</ ul >

</ div >
</ div >
< div  id ="main" >
< asp:ContentPlaceHolder  ID ="MainContent"  runat ="server"   />
< div  id ="footer" >
</ div >
</ div >
</ div >
</ body >
</ html >  

 

                               --------转载自 http://www.cnblogs.com/azev/archive/2009/04/22/1441557.html


目录
相关文章
|
3月前
|
开发框架 JavaScript 前端开发
揭秘:如何让你的asp.net页面变身交互魔术师——先施展JavaScript咒语,再引发服务器端魔法!
【8月更文挑战第16天】在ASP.NET开发中,处理客户端与服务器交互时,常需先执行客户端验证再提交数据。传统上使用ASP.NET Button控件直接触发服务器事件,但难以插入客户端逻辑。本文对比此法与改进方案:利用HTML按钮及JavaScript手动控制表单提交。后者通过`onclick`事件调用JavaScript函数`SubmitForm()`来检查输入并决定是否提交,增强了灵活性和用户体验,同时确保了服务器端逻辑的执行。
48 5
|
19天前
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
|
6月前
|
开发框架 .NET 中间件
七天.NET 8操作SQLite入门到实战 - (2)第七天Blazor班级管理页面编写和接口对接
七天.NET 8操作SQLite入门到实战 - (2)第七天Blazor班级管理页面编写和接口对接
127 7
|
3月前
|
开发框架 .NET Docker
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
|
3月前
|
开发框架 前端开发 .NET
七天.NET 8操作SQLite入门到实战 - (3)第七天Blazor学生管理页面编写和接口对接
七天.NET 8操作SQLite入门到实战 - (3)第七天Blazor学生管理页面编写和接口对接
|
3月前
|
API 开发者
.NET 结果与错误处理利器 FluentResults
【8月更文挑战第1天】FluentResults 是一款专为 .NET 开发者设计的结果与错误处理库,它以简洁强大的接口颠覆了传统的错误处理方式。通过直观的 API,开发者可以轻松管理成功的状态和各种错误情形,实现结果的流畅组合与转换。无论是复杂的业务逻辑还是异常情况,FluentResults 都能让处理过程变得清晰高效,为 .NET 项目的稳健运行提供有力支持。
|
5月前
|
安全 程序员 Shell
老程序员分享:NSIS自定义界面,下载并安装Net.Framework4.8
老程序员分享:NSIS自定义界面,下载并安装Net.Framework4.8
|
5月前
|
存储 分布式计算 大数据
MaxCompute操作报错合集之自定义udf的函数,引用了import net.sourceforge.pinyin4j.PinyinHelper;但是上传资源后,出现报错,是什么原因
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
100 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
45 0

相关实验场景

更多