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 件のコメント:
コメントを投稿