【问题标题】:MVC InvalidOperationException with custom error pages带有自定义错误页面的 MVC InvalidOperationException
【发布时间】:2011-11-08 01:48:12
【问题描述】:

我有自定义错误页面设置使用

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

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

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

System.InvalidOperationException 视图“错误”或其主视图是 未找到或没有视图引擎支持搜索的位置。这 搜索了以下位置: ~/Areas/Football/Views/Draft/Error.aspx ~/Areas/Football/Views/Draft/Error.ascx ~/Areas/Football/Views/Shared/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 ~/Areas/Football/Views/Draft/Error.vbhtml ~/Areas/Football/Views/Shared/Error.cshtml ~/Areas/Football/Views/Shared/Error.vbhtml ~/Views/Draft/Error.cshtml ~/Views/Draft/Error.vbhtml ~/Views/Shared/Error.cshtml ~/Views/Shared/Error.vbhtml

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

有什么想法吗?

谢谢。

【问题讨论】:

  • 因为 customErrors 是 ASP.NET 处理的东西(不是 ASP.NET MVC),所以它不是完成这项工作的最佳工具。 Richard Dingwall 对此有一篇出色的文章:richarddingwall.name/2008/08/17/…

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您还可以通过使用Remove 方法从全局过滤器中删除HandleErrorAttribute 来确保它没有被注册:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        我错过了什么吗?

        【讨论】:

        • 似乎对我有用,让我有点紧张,但看不出有什么问题。
        • 使用 StackExchange.Exceptional 而不是 Elmah 的自定义错误为我工作。
        【解决方案5】:

        MVC 项目默认在Global.asax.cs 文件中添加HandleErrorAttribute

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

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

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

        【讨论】:

        • 谢谢你是对的,这似乎正是正在发生的事情。我将默认错误视图放回并抛出异常,关于找不到默认视图的错误消失了。但是 elmah 不会记录异常。我可以使用默认视图,但是 elmah 怎么不记录错误?它记录 404 就好了,但不是服务器 500 错误。
        • @Aros - 您需要为 Elmah 实现特殊版本的 HandleErrorAttribute。你可以在这里找到一个例子:hanselman.com/blog/…
        • 谢谢现在我注释掉了答案中的行,并且依赖于从 web.config 重定向的自定义错误。如果这会导致问题,我将在这里使用答案。 stackoverflow.com/questions/766610/… 有人知道我为什么不想注释掉那行代码吗?
        • 当抛出未处理的异常时执行此过滤器。它将视图设置为错误。 这是一条非常有价值的信息。非常感谢。
        猜你喜欢
        • 2012-10-20
        • 2015-09-10
        • 2016-11-09
        • 2014-06-27
        • 1970-01-01
        • 2014-11-09
        • 2018-12-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多