RealPath:
WebPath:
2017/09/15 00:57 (JST) 更新
コントローラ詳細 >>

アクションフィルタ

Contents

アクションフィルタにより、任意アクションの実行直前や実行直後に挿入する動作を定義することができる。

特に置き場所の決まりは無く、プロジェクトフォルダ直下の Filters フォルダ(手動で作成)に置いたりする。

アクションフィルタの作成

アクションフィルタは ActionFilterAttribute を継承した属性クラスとして定義する。

/Filters/SampleFilterAttribute.cs
using Microsoft.AspNetCore.Mvc.Filters;

public class SampleFilterAttribute : ActionFilterAttribute
{
}

当然このままでは何の意味もなさないフィルタとなるが、定義としては有効。

アクション実行直前の動作の定義

OnActionExecuting() を override 実装することによりアクション実行直前の動作を定義することができる。

認証状態のチェック等に利用されることが多い。

/Filters/SampleFilterAttribute.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

public class SampleFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // 認証チェックを行い、認証済みでなかったら 401 Unauthorized 応答を返す
        var 認証結果 = 認証チェック();
        if (!認証結果)
        {
            // 401 Unauthorized 応答
            filterContext.HttpContext.Response.StatusCode = 401;
            filterContext.HttpContext.Response.Headers.Clear();
            filterContext.Result = new EmptyResult();
            return;
        }

        // ViewData を介して認証情報を受け渡す
        var c = filterContext.Controller as Controller;
        if (c == null) return;
        c.ViewData["loginUser"] = 認証済みユーザ名();    
    }
}

アクション実行直後の動作の定義

OnActionExecuted() を override 実装することによりアクション実行直後の動作を定義することができる。

OnActionExecuted() が呼ばれるタイミングはアクションメソッド実行直後でビューレンダリング直前であり、この性質は ViewData の書き換え等に利用できる。

/Filters/SampleFilterAttribute.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

public class SampleFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        var c = filterContext.Controller as Controller;
        if (c == null) return;
        if (c != null)
        {
            c.ViewData["Sample"] = "Y";
        }
    }
}

アクションフィルタの利用

個別アクションへの適用

アクションフィルタはアクションメソッドの属性としてフィルタを指定することができる。

/Controllers/HomeController.cs
using Microsoft.AspNetCore.Mvc;

public class HomeController : Controller
{
    [SampleFilter] // 個別アクションへのフィルタ適用
    public IActionResult Index()
    {
        ViewData["Sample"] = "A";
        return View();
    }

    public IActionResult About()
    {
        ViewData["Sample"] = "B";
        return View();
    }
}

上記例では /Home/Index 呼び出し時にのみ SampleFilterAttribute の動作が適用される。

コントローラへの適用

コントローラクラスへフィルタ属性を指定することもできる。その場合、そのコントローラの全アクションに対してフィルタ動作が適用される。

/Controllers/HomeController.cs
using Microsoft.AspNetCore.Mvc;

[SampleFilter] // コントローラへのフィルタ適用
public class HomeController : Controller
{
    public IActionResult Index()
    {
        ViewData["Sample"] = "A";
        return View();
    }

    public IActionResult About()
    {
        ViewData["Sample"] = "B";
        return View();
    }
}

上記例では /Home/Index および /Home/About 両方の呼び出し時に SampleFilterAttribute の動作が適用される。