带有自定义错误页面的MVC InvalidOperationException

时间:2011-09-01 01:11:58

标签: asp.net-mvc asp.net-mvc-routing

我使用

设置了自定义错误页面
<customErrors mode="On" defaultRedirect="~/Home/Error">
    <error statusCode="404" redirect="~/Home/PageNotFound" />
</customErrors>

我创建了一个抛出异常的页面,然后重定向到正确的错误页面。

但是我注意到生产网络服务器上的elmah中的这些错误:

  

System.InvalidOperationException视图'错误'或其主人是   找不到或没有视图引擎支持搜索的位置。该   搜索了以下位置:   〜/地区/足球/浏览/草案/ Error.aspx   〜/地区/足球/浏览/草案/ Error.ascx   〜/地区/足球/查看/共享/ Error.aspx   〜/ Areas / Football / Views / Shared / Error.ascx~ / Views / Draft / Error.aspx   〜/ Views / Draft / Error.ascx~ / Views / Shared / Error.aspx   〜/ Views / Shared / Error.ascx~ / Areas / Football / Views / Draft / Error.cshtml   〜/地区/足球/浏览/草案/ Error.vbhtml   〜/地区/足球/查看/共享/ Error.cshtml   〜/ Areas / Football / Views / Shared / Error.vbhtml~ / Views / Draft / Error.cshtml   〜/ Views / Draft / Error.vbhtml~ / Views / Shared / Error.cshtml   〜/查看/共享/ Error.vbhtml

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

有什么想法吗?

感谢。

5 个答案:

答案 0 :(得分:28)

默认情况下,MVC项目会在Global.asax.cs文件中添加HandleErrorAttribute

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

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

您可以创建自己的例外过滤器并进行注册。

答案 1 :(得分:5)

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

我错过了什么吗?

答案 2 :(得分:1)

您还可以使用Remove方法将for loop从全局过滤器中删除,以确保HandleErrorAttribute未注册:

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

答案 3 :(得分:0)

对于本文的未来读者,请注意Elmah添加了自己的HandleErrorAttribute,因此也期待Error.cshtml视图。请注意,我还安装了Elmah.MVC NuGet包,但它只是用于正确设置它。

是的,刚刚在nuget.org上注意到Elmah.MVC负责添加HandleErrorAttribute:

  

将ELMAH功能轻松集成到ASP.NET MVC中   应用。只需将包放在ASP.NET MVC应用程序中即可   和访问/ elmah URL。它还将安装全局HandleError过滤器,   这可以保证记录所有未处理的错误(即使是customError   转“开”)。

答案 4 :(得分:0)

要禁用ELMAH&#39; HandleErrorAttribute,请将以下行添加到Web.Config文件的appSettings部分:

<!-- language: lang-xml -->
<add key="elmah.mvc.disableHandleErrorFilter" value="true" />