我使用
设置了自定义错误页面<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中添加了我的自定义错误页面,因为我在配置文件中指定了一个新的默认值。
有什么想法吗?
感谢。
答案 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" />