ASP.NET Coreの フィルター(Filter)は、要求処理パイプラインの前後に処理を実行したり、コントローラー側で発生した例外(Exception)を、例外フィルターで共通的に処理したりする便利な役割を持ちます。
この記事では、フィルター側で ViewResult および、ViewData を生成して IActionResultに設定する方法を紹介します。
ViewResult
ViewResult は、応答にビュー(HTML)をレンダリングするオブジェクトであり、ASP.NET Core を触った人であれば、誰しもが知っているであろう。
コントローラーから ViewResultを返す
コントローラー側の処理から ViewResult を返すのは簡単で、ネットに一杯サンプルが転がっているので迷うことはないだろう。
例えば、ViewData に message 名前で値を設定して、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
};
}

0 件のコメント:
コメントを投稿