2011-09-01 65 views
10

我使用MVC出现InvalidOperationException与自定义错误页

<customErrors mode="On" defaultRedirect="~/Home/Error"> 
    <error statusCode="404" redirect="~/Home/PageNotFound" /> 
</customErrors> 

我创建了一个网页,抛出和异常和我重定向到正确的错误页自定义错误页的设置。

但是我注意到在生产Web服务器中ELMAH这些错误:

System.InvalidOperationException视图“错误”或它的主人是 没有发现或没有视图引擎支持搜索到的位置。 以下地点被搜索: 〜/地区/ Football/Views/Draft/Error.aspx 〜/地区/ Football/Views/Draft/Error.ascx 〜/ Areas/Football/Views/Shared/Error.aspx 〜/地区/足球/查看/共享/ Error.ascx〜/查看/草案/ Error.aspx 〜/查看/草案/ Error.ascx〜/查看/共享/ Error.aspx 〜/查看/共享/错误。 ASCX〜/地区/足球/查看/草案/ Error.cshtml 〜/地区/足球/查看/草案/ Error.vbhtml 〜/地区/足球/查看/共享/ Error.cshtml 〜/地区/足球/浏览次数/Shared/Error.vbhtml〜/查看/草案/ Error.cshtml 〜/查看/草案/ Error.vbhtml〜/查看/共享/ Error.cshtml 〜/查看/共享/ Error.vbhtml

为什么找其他地方的错误页面?我删除了〜/ Views/Shared/Error.cshtml并在〜/ Home/Error中添加了我的自定义错误页面,因为我在配置文件中指定了一个新的默认值。

任何想法?

谢谢。

+0

由于'customErrors'是(不是ASP的东西ASP.NET交易.NET MVC),它不是这项工作的最佳工具。理查德丁沃尔有一个很好的职位:http://richarddingwall.name/2008/08/17/strategies-for-resource-based-404-errors-in-aspnet-mvc/ –

回答

26

MVC项目默认情况下,在Global.asax.cs文件

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
    } 

当未处理的异常时,将执行此过滤器将被HandleErrorAttribute。它将视图设置为Error。因此MVC运行时尝试呈现该视图。但就你而言,没有这种看法。因此它再次抛出另一个由ASP.NET运行时处理的异常,并显示您在Web.Config文件中配置的错误页面。

您可以创建自己的异常过滤器并注册它。

+0

谢谢你是对的,似乎是到底发生了什么。我放置了默认的错误视图并抛出一个异常,关于找不到默认视图的错误消失了。但是,elmah不会记录异常。我很好地使用默认视图,但elmah如何不记录错误?它记录404很好,但不是服务器500错误。 –

+2

@Aros - 您需要为Elmah实现HandleErrorAttribute的特殊版本。你可以在这里找到一个例子:http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx –

+0

谢谢你现在我在回答中注释掉了这一行,并且依靠从web.config重定向的自定义错误。如果导致问题,我会在这里使用答案。 http://stackoverflow.com/questions/766610/how-to-get-elmah-to-work-with-asp-net-mvc-handleerror-attribute/779961#779961 任何人都知道为什么我不想评论那行代码出来了? –

5

我最终在Global.asax中注册了HandleErrorAttribute,并且只使用了<customErrors>部分。 ELMAH现在可以正确记录错误,并且我可以指定自定义错误页面。

我错过了什么吗?

+0

似乎为我工作,让我有点紧张,但看不出有什么问题。 – andrewb

+0

为我使用StackExchange.Exceptional而不是Elmah自定义错误。 – Gareth

0

对于这个职位的未来的读者,请注意ELMAH添加自己的HandleErrorAttribute所以也期待Error.cshtml视图。请注意,我还安装了Elmah.MVC NuGet包,但只是用于正确设置它。

是的,就注意到了这nuget.org是Elmah.MVC负责添加HandleErrorAttribute:

无痛整合ELMAH功能集成到ASP.NET MVC应用 。只需将该包放入ASP即可。NET MVC应用程序 和访问/ elmah URL。它还将安装全局HandleError过滤器, ,确保记录所有未处理的错误(即使customError 已转为“开”)。

1

您也可以确保该HandleErrorAttribute没有从全局过滤器取出,用Remove方法注册:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Remove(new HandleErrorAttribute()); 
     /* ... your other filters */ 
    } 
}