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

时间:2013-10-10 13:27:12

标签: c# asp.net-mvc asp.net-mvc-4

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

  

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

我明白了这个错误发生的原因(因为控制器试图将HandleErrorInfo类型的模型传递给原始视图)但是我无法弄清楚的是如何阻止此错误出现在事件查看器中并显示真实错误。

所以事件的顺序是:

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

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

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

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

    但是与HandleErrorAttribute解决方法具有相同的结果。

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

2 个答案:

答案 0 :(得分:0)

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

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

您如何知道第一次点击正确的错误页面?

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

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

确保您的错误页面始终有自己的简化布局页面,因此不存在由于强类型布局/母版页而导致问题的风险,这将导致与您类似的错误。

答案 1 :(得分: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>
}