[ASP.NET Core] フィルター上でViewResult.ViewData を扱う

2022年8月17日水曜日

ASP.NET

t f B! P L

ASP.NET Coreの フィルター(Filter)は、要求処理パイプラインの前後に処理を実行したり、コントローラー側で発生した例外(Exception)を、例外フィルターで共通的に処理したりする便利な役割を持ちます。

この記事では、フィルター側で ViewResult および、ViewData を生成して IActionResultに設定する方法を紹介します。

ViewResult

ViewResult は、応答にビュー(HTML)をレンダリングするオブジェクトであり、ASP.NET Core を触った人であれば、誰しもが知っているであろう。

コントローラーから ViewResultを返す

コントローラー側の処理から ViewResult を返すのは簡単で、ネットに一杯サンプルが転がっているので迷うことはないだろう。

例えば、ViewDatamessage 名前で値を設定して、Viewをレスポンスに返す場合は次のように書く。

public IActionResult Index()
{
  ViewData["message"] = "Hello ASP.NET!!";
  return View("view_name");
}

フィルター(Filter)から ViewResultを返す

ここからが本題であるが、フィルターからビューに値を渡す ViewResultを作って ActionResult に設定する場合は一工夫必要である。

具体的には、ViewData を設定するために、IModelMetadataProvider なるクラスのインスタンスを取得する必要がある。

実際に、例外フィルターの処理の中で、IModelMetadataProvider を取得して、ViewDataを設定した ViewResultを作るサンプルコードは以下となる。

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.ViewFeatures;

public  void OnException(ExceptionContext context)
{
    var provider = (IModelMetadataProvider)context.HttpContext.RequestServices.GetService(typeof(IModelMetadataProvider));
    var state = new ViewDataDictionary(provider, new ModelStateDictionary());
    state["message"] = "Hello ASP.NET Core";

    context.Result = new ViewResult() 
    { 
        ViewName = "Error",
        ViewData = state
    };

}
スポンサーリンク
スポンサーリンク

このブログを検索

Profile

自分の写真
Webアプリエンジニア。 日々新しい技術を追い求めてブログでアウトプットしています。
プロフィール画像は、猫村ゆゆこ様に書いてもらいました。

仕事募集もしていたり、していなかったり。

QooQ