首页 文章

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

提问于
浏览
10

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

<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 /意见/ 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中添加了我的自定义错误页面,因为我在配置文件中指定了一个新的默认值 .

有任何想法吗?

谢谢 .

5 回答

  • 0

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

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

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

    您可以创建自己的异常过滤器并进行注册 .

  • 5

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

    我错过了什么吗?

  • 1

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

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

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

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

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

  • 0

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

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

相关问题