ASP.NET Core で全アクション共通で実行するロジックを実行する
例えば _Layout.cshtml内で本日のドル円レートを表示するとして、全てのコントローラの、全てのアクションに ViewDataへの代入を書いて回るのは流石にエレファント. そういう場合はどうすればいいかという話です.
プロジェクトに Filtersフォルダを掘って、MyFilter.csを作ります. 以下のように IActionFilterを継承したクラスを作ります. 非同期の場合は IAsyncActionFilterを継承します. OnActionExecutingはアクション実行前、OnActionExecutedはアクション実行後に発火します. context.Controllerを Controllerにキャストすると ViewDataにアクセスできます.
usingMicrosoft.AspNetCore.Mvc;usingMicrosoft.AspNetCore.Mvc.Filters;namespaceWebApplication1.Filters{publicclassMyFilter:IActionFilter{publicvoidOnActionExecuting(ActionExecutingContextcontext){}publicvoidOnActionExecuted(ActionExecutedContextcontext){varc=context.ControllerasController;c.ViewData["foo"]="bar";}}}このフィルタが使われるようにするため、Startup.csを開き、ConfigureServicesメソッドの中の AddControllersWithViewsを以下のように書き換えます.
services.AddControllersWithViews(options=>{options.Filters.Add(typeof(MyFilter));});