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

本文关键字:类型 模型 字典 HandleErrorInfo Mvc System Web | 更新日期: 2023-09-27 18:34:50

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

传递到字典中的模型项的类型为"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 解决方法具有相同的结果。

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

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

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

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

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

错误

页面包含哪些内容,其他内容会触发错误吗?

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

确保您的错误页

始终具有自己的简化布局页,这样就不会因强类型布局/母版页而导致问题的风险,从而导致与您的错误类似的错误。

我处理这个问题的解决方案是删除布局页面顶部的 @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>
}