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

この問題に対処するための私の解決策は、レイアウト ページの上部にある @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 に答える