共有 _Layout.cshtml ファイル内のすべてのビューで使用するために、いくつかの共通情報を ViewBag に配置する役割を担うアクション フィルターがあります。
public class ProductInfoFilterAttribute : ActionFilterAttribute
{
public override void
OnActionExecuting(ActionExecutingContext filterContext)
{
// build product info
// ... (code omitted)
dynamic viewBag = filterContext.Controller.ViewBag;
viewBag.ProductInfo = info;
}
}
共有の _Layout.cshtml ファイルでは、ViewBag に入れられた情報を使用します。
...
@ViewBag.ProductInfo.Name
...
コントローラー アクションの処理中に例外が発生した場合、標準の HandleErrorAttribute は共有の Error.cshtml ビューを表示する必要があります。これは、上記のアクション フィルターを導入して _Layout.cshtml で ViewBag からの新しい値の使用を開始する前に機能していました。これで、カスタムの Error.cshtml ビューではなく、標準の ASP.Net ランタイム エラー ページが表示されます。
エラー ビューのレンダリング中に、_Layout.cshtml で ViewBag.ProductInfo.Name を使用すると、RuntimeBinderException (「null 参照でランタイム バインディングを実行できません」) がスローされるという事実までこれを追跡しました。
元の例外がスローされる前にアクション フィルターが ViewBag の値を正常に設定したにもかかわらず、Error.cshtml ビューをレンダリングするときに空の ViewBag を持つ新しいコンテキストが使用されているようです。
アクション フィルターによって作成されたデータをカスタム エラー ビューで使用できるようにする方法はありますか?