8

每当我的应用程序发生错误时,我都无法在事件查看器中查看正确的错误。在它的地方我得到以下错误......

传入字典的模型项的类型为“System.Web.Mvc.HandleErrorInfo”,但此字典需要“LayoutPageViewModel”类型的模型项

我明白为什么会发生此错误(因为控制器试图将 HandleErrorInfo 类型的模型传递给原始视图)但我不知道如何阻止此错误出现在事件查看器中并显示真正的错误。

所以事件的顺序是:

  1. 应用程序发生异常
  2. 默认错误处理尝试将“System.Web.Mvc.HandleErrorInfo”类型的模型传递到默认布局页面,该页面接受“LayoutPageViewModel”模型
  3. 另一个异常发生在应用程序中,因为布局正在传递一个“HandleErrorInfo”类型的模型
  4. 自定义错误 500 页面(在 web.config 中指定)被命中,它不引用任何布局:

    @{ Layout = null; }
    
  5. 错误页面显示正确,但事件查看器中的异常不正确。

我已经尝试在 Application_Start 中设置 HandleErrorAttribute 过滤器的主视图和视图,但这会停止在事件日志中注册的任何内容。我也尝试将以下方法添加到控制器中......

protected override void OnException(ExceptionContext filterContext)
{
    filterContext.Result = new ViewResult {
        ViewName = "~/Views/Shared/Error.cshtml",                
    };
}

但这与 HandleErrorAttribute 解决方法的结果相同。

有谁知道我如何解决这个问题?

4

2 回答 2

0

听起来您遇到了次要错误,这使得最终结果成为基于类型的问题。

在尝试其他处理异常的方法之前,会先查看您显示异常的方式。

你怎么知道第一次点击了正确的错误页面?

错误页面包含哪些内容,还有什么会触发错误吗?

知道您说错误页面没有对布局页面的引用。将仔细检查这是否实际被使用,而不仅仅是在第二个实例中被调用,交替从 main 中删除布局以确保。

确保您的错误页面始终具有自己的简化布局页面,这样就不会有由于强类型布局/母版页导致出现与您的类似错误的风险。

于 2014-07-24T04:34:55.967 回答
0

我处理该问题的解决方案是删除布局页面顶部的 @model 指令,然后在我通常希望看到我的模型在可能传入的不同模型之间切换的地方进行一些检查,例如

@if (Model is System.Web.Mvc.HandleErrorInfo)
{
    <title>Error</title>
}
else if (Model.GetType() == typeof(MyApp.Models.LayoutPageViewModel))
{
    <meta name="description" content="@Model.PageMetaDescription">
    <title>@Model.PageTitleComplete</title>
}
于 2015-05-28T23:10:36.833 回答