ASP.Net MVC自定义错误处理通过操作筛选器属性

问题描述:

我试图通过操作筛选器属性实现自定义错误处理。ASP.Net MVC自定义错误处理通过操作筛选器属性

我的代码如下:

[HandleError (Order = 2)] 
[HandleError (Order = 1, ExceptionType = typeof(NullReferenceException), View = "CustomError")] 
public class ArticlesController : Controller 
{ 

    public object OhDearACrash() 
    { 
     throw new Exception("Oh Dear"); 
    } 

    public ActionResult NullRefCrash() 
    { 
     throw new NullReferenceException(); 
    } 

    public ActionResult ThrowNotImplemented() 
    { 
     throw new NotImplementedException(); 
    } 

OhDearACrash和ThrowNotImplemented都是通过这使得位于查看/共享经由Error.aspx错误消息[的HandleError]拾取。

例如与OhDearACrash:

Message = <%= ViewData.Model.Exception.Message %> 

呈现

Message = Oh Dear 

NullRefCrash由与ExceptionType = typeof运算(的NullReferenceException)涉及的[HandeError]拾取。

当CustomError企图使使用

Message = <%= ViewData.Model.Exception.Message %> 

的ViewData.Model为空并产生一个异常

System.NullReferenceException was unhandled by user code 
Message="Object reference not set to an instance of an object." 

要创建CustomError.aspx错误消息我复制Error.aspx并粘贴到我新创建的视图/错误并重命名为CustomView.aspx。

由于Error.aspx和CustomError.aspx基本相同,这是怎么发生的?

编辑:

我创建了一个只包含上面和CustomError.aspx视图工作完全正常测试项目 - 反正有没有调试我现有的项目找到了问题?

我刚刚在ASP.NET MVC 1.0上试了一下,我得到了正确的行为。

是否有可能你有另一个过滤器正在运行,并以某种方式更改错误?

+0

理论上不,它的发生就像我描述的那样。如果我逐步执行代码,它将从ThrowNotImplemented到CustomError.aspx,就像从OhDearACrash到Error.aspx一样。 – 2009-12-30 19:48:36

+0

当我复制了共享视图目录中的错误页面并将其粘贴回来并重命名为MyError,并通过[HandleError(Order = 1,ExceptionType = typeof(NullReferenceException),View =“MyError”)]作品,你在测试中使用了Views/Shared目录吗? – 2010-01-01 23:12:49