ASP.NET MVC 5和Elmah的自定义错误页面

7
我试图在asp mvc 5中使用自定义错误页面,但由于某种奇怪的原因,在测试我的页面时,从elmah中记录了两个错误(我正在测试的真正错误和一个与找不到错误页面相关的错误):
“未找到视图'Error'或其主控件,也没有视图引擎支持搜索的位置。已搜索以下位置:~/Views/HotTowel/Error.aspx, ~/Views/HotTowel/Error.ascx, ~/Views/Shared/Error.aspx, ~/Views/Shared/Error.ascx, ~/Views/HotTowel/Error.cshtml, ~/Views/HotTowel/Error.vbhtml, ~/Views/Shared/Error.cshtml, ~/Views/Shared/Error.vbhtml。”
我查看了这个网址http://doingthedishes.com/2011/09/10/custom-errors-mvc-3-elmah.html,作者遇到了相同的问题,但是是在asp.net mvc 3中。阅读后,我尝试删除对HandleErrorAttribute的调用:
  public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        //filters.Add(new HandleErrorAttribute());
    }
}

但问题仍然存在:我可以看到我的自定义页面,但是asp.net mvc会抛出两个异常。需要帮助吗?
解决方案是重写一个派生自HandleErrorAttribute类的类吗? 像这篇文章中所示:持续收到Elmah和asp.net mvc 4中未找到“错误”视图的消息
2个回答

9

您可以从ELMAH.MVC 2.0.2发布中执行以下操作:

  1. Set disableHandleErrorFilter to true:

    <add key="elmah.mvc.disableHandleErrorFilter" value="true" />
    
  2. Remove filters.Add(new HandleErrorAttribute()); from FilterConfig class:

    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
          // filters.Add(new HandleErrorAttribute()); // <-- comment out
        }
    }
    

1
这里为您提供一种可能的解决方案。我通常在基础控制器类中覆盖OnException方法。filterContext.HttpContext.IsCustomErrorEnabled检查web.config中的<customErrors>showVerboseErrors变量是从web.config中的设置派生出来的。
protected override void OnException(ExceptionContext filterContext)
{
    if (filterContext.HttpContext.IsCustomErrorEnabled)
    {
        //trigger elmah
        Elmah.ErrorSignal.FromCurrentContext().Raise(filterContext.Exception);

        //get the last elmah error
        var errorList = new List<ErrorLogEntry>();
        Elmah.ErrorLog.GetDefault(filterContext.HttpContext.ApplicationInstance.Context).GetErrors(0, 1, errorList);
        var error = errorList.LastOrDefault();

        //return the custom error page
        filterContext.Result = new ViewResult
        {
            ViewName = "~/Views/Shared/Error.cshtml",
            ViewData = new ViewDataDictionary() {
                { "ErrorDetails", showVerboseErrors && error != null ? filterContext.Exception.Message : null },
                { "ErrorId", error != null ? error.Id : null }
            }
        };

        //stop further error processing
        filterContext.ExceptionHandled = true;
    }
    else
    {
        base.OnException(filterContext);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接