ASP.NET MVC で カスタムフィルター の 実装方法

0 件のコメント

独自フィルター(カスタムフィルター)を作成、実装することで、各アクションに対して画一的な処理を "簡単に" 施すことができるようになります。 例えば「特定の条件を満たさない場合、実行できなくする」「ユーザーのページ遷移を記録する」「キャッシュを無効化する」といったことができるようになります。

この 独自フィルター の実装方法ですが、通常は FilterAttribute クラスを継承して作成します。 簡易的に 組込フィルタークラス を継承することでも 独自フィルター を作成できます。
※フィルター の 実行順序 は こちら をご参照ください。

以下では「キャッシュを無効化する独自フィルター」を実装する手順を見ていきます。

実装手順

  1. 独自フィルター を作成する プロジェクト を選択し、[プロジェクト]-[新しい項目の追加] を選択
  2. 任意の名前で「クラス」を「追加」
    (ここでは NoCacheAttribute としています。)
  3. FilterAttribute を継承
        public class NoCacheAttribute: FilterAttribute
    
  4. IResultFilter を実装
    (どの インターフェース を実装すべきかの判断は こちら をご参照ください。)
        public class NoCacheAttribute: FilterAttribute, IResultFilter
    
  5. .OnResultExecuted を実装
            public void OnResultExecuted(ResultExecutedContext filterContext)
            {
                var response = filterContext.HttpContext.Response;
                response.Cache.SetCacheability(HttpCacheability.NoCache);
            }
    
  6. .OnResultExecuting の内容を削除
            public void OnResultExecuting(ResultExecutingContext filterContext)
            {
                // 処理を行わないので、明示的に処理を削除します。
                ////throw new NotImplementedException();
            }
    

最終的なソースコード

namespace SampleMvcApplication.Controllers
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;

    /// <summary>
    /// キャッシュを無効化するフィルター属性を表します。
    /// </summary>
    public class NoCacheAttribute: FilterAttribute, IResultFilter
    {
        /// <summary>
        /// アクション結果の実行後に ASP.NET MVC フレームワークによって呼び出されます。
        /// </summary>
        /// <param name="filterContext">フィルター コンテキスト</param>
        public void OnResultExecuted(ResultExecutedContext filterContext)
        {
            var response = filterContext.HttpContext.Response;
            response.Cache.SetCacheability(HttpCacheability.NoCache);
        }

        /// <summary>
        /// アクション結果の実行前に ASP.NET MVC フレームワークによって呼び出されます。
        /// </summary>
        /// <param name="filterContext">フィルター コンテキスト</param>
        public void OnResultExecuting(ResultExecutingContext filterContext)
        {
        }
    }
}

今回、参考にしたサイトは以下の通りです。