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

问题描述 投票:5回答:2

我正在尝试在asp mvc 5中制作工作自定义错误页面,但由于一些奇怪的原因,在时刻测试我的页面,从elmah我正在记录两个错误(真正的错误我正在测试和错误页面找不到相关的错误:

未找到视图“错误”或其主控,或者没有视图引擎支持搜索的位置。搜索了以下位置:〜/ 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的类?喜欢这篇文章:keep getting The view "Error" not found when using Elmah and asp.net mvc 4

asp.net-mvc-5 elmah
2个回答
8
投票

您可以从ELMAH.MVC 2.0.2 is out执行以下操作:

  1. disableHandleErrorFilter设为true<add key="elmah.mvc.disableHandleErrorFilter" value="true" />
  2. filters.Add(new HandleErrorAttribute());类中删除FilterConfigpublic 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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.