独自のフィルタ
ActionFilterAttributeクラスは、ASP.NET MVCにおけるフィルタを適用するために作られたひな形の属性クラスで、以下のメンバを含みます。
| メソッド | 概要 |
| OnActionExecutedメソッド | Action前に適用されるフィルタ |
| OnActionExecutingメソッド | Action後に適用されるフィルタ |
| OnResulteExecutedメソッド | Result前に適用されるフィルタ |
| OnResultExecutingメソッド | Result後に適用されるフィルタ |
前述したように、これらのメソッドはひな型なので、自分でオーバーライドし、必要な形に処理を記述する必要があります。
ASP.NET MVCにおける利用例としては、「Model」フォルダに(「Filter」フォルダを作成しそちらに配置してもOK)ActionFilterAttributeクラスを継承したクラスを作成し、フィルタをかけたい処理を記述します。以下は、認証ユーザー以外のユーザーに対して、警告を表示するフィルタです。なお、独自のフィルタを作成する場合は命名規則として「XXXAttribute」とAttributeを最後に付ける必要があります。
using System.Web.Mvc;
using System.Web.Routing;
using System.Diagnostics;
namespace OptionMVCSampleCS.Models
{
public class LogFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(
ActionExecutingContext filterContext)
{
// Log出力
LogOutput("OnActionExecuting", filterContext.RouteData);
}
public override void OnActionExecuted(
ActionExecutedContext filterContext)
{
// Log出力
LogOutput("OnActionExecuted", filterContext.RouteData);
}
private static void LogOutput(
string step, RouteData routeData)
{
// controller/actionを取得
string controllername = routeData.Values["controller"] as string;
string actionname = routeData.Values["action"] as string;
// メッセージを作成
string logs = string.Format(
"LogFilterによるログ出力: {0} アクション名:{1} コントローラ名:{2}",
step, actionname, controllername);
// ログ出力
Debug.WriteLine(logs);
}
}
}
作成したフィルタは、Controllerクラスファイル内で、属性クラスとして適用できます。以下は、PubsControllerクラスにフィルタを適用した例です。
[LogFilter]
public class PubsController : Controller
{
public ActionResult Hello()
{
// <中略>
}
// <中略>
}
上記の設定を行った場合のログ出力例は以下の通りです。
LogFilterによるログ出力: OnActionExecuting アクション名:Hello コントローラ名:Pubs LogFilterによるログ出力: OnActionExecuted アクション名:Hello コントローラ名:Pubs LogFilterによるログ出力: OnActionExecuting アクション名:AJAXIndex コントローラ名:Pubs LogFilterによるログ出力: OnActionExecuted アクション名:AJAXIndex コントローラ名:Pubs
このように、フレームワーク側で独自のフィルタを作成する枠組みは提供されているので、開発者は必要に応じて独自のフィルタを簡単に作成できます。
