アクション フィルターについて理解する (VB)

作成者: Microsoft

PDF のダウンロード

このチュートリアルの目的は、アクション フィルターについて説明することです。 アクション フィルターは、アクションの実行方法を変更するコントローラー アクション (またはコントローラー全体) に適用できる属性です。

アクション フィルターについて

このチュートリアルの目的は、アクション フィルターについて説明することです。 アクション フィルターは、アクションの実行方法を変更するコントローラー アクション (またはコントローラー全体) に適用できる属性です。 ASP.NET MVC フレームワークには、いくつかのアクション フィルターが含まれています。

  • OutputCache – このアクション フィルターは、コントローラー アクションの出力を指定した時間キャッシュします。
  • HandleError – このアクション フィルターは、コントローラー アクションの実行時に発生したエラーを処理します。
  • 承認 – このアクション フィルターを使用すると、特定のユーザーまたはロールへのアクセスを制限できます。

独自のカスタム アクション フィルターを作成することもできます。 たとえば、カスタム認証システムを実装するためにカスタム アクション フィルターを作成できます。 または、コントローラー アクションによって返されるビュー データを変更するアクション フィルターを作成することもできます。

このチュートリアルでは、最初からアクション フィルターを構築する方法について説明します。 アクションの処理のさまざまな段階を Visual Studio の [出力] ウィンドウに記録する [ログ] アクション フィルターを作成します。

アクション フィルターの使用

アクション フィルターは属性です。 ほとんどのアクション フィルターは、個々のコントローラー アクションまたはコントローラー全体に適用できます。

たとえば、リスト 1 のデータ コントローラーは、現在の時刻を返す という名前 Index() のアクションを公開します。 このアクションは、アクション フィルターで OutputCache 装飾されます。 このフィルターにより、アクションによって返された値が 10 秒間キャッシュされます。

リスト 1 – Controllers\DataController.vb

Public Class DataController
     Inherits System.Web.Mvc.Controller

     <OutputCache(Duration:=10)> _
     Function Index()
          Return DateTime.Now.ToString("T")

     End Function

End Class

ブラウザーの Index() アドレス バーに URL /Data/Index を入力し、[更新] ボタンを複数回押してアクションを繰り返し呼び出すと、10 秒間同じ時間が表示されます。 アクションの Index() 出力は 10 秒間キャッシュされます (図 1 を参照)。

キャッシュされた時間

図 01: キャッシュされた時間 (クリックするとフルサイズの画像が表示されます)

リスト 1 では、1 つのアクション フィルター ( OutputCache アクション フィルター) が メソッドに Index() 適用されます。 必要に応じて、同じアクションに複数のアクション フィルターを適用できます。 たとえば、アクション フィルターと HandleError アクション フィルターの両方をOutputCache同じアクションに適用できます。

リスト 1 では、 OutputCache アクション フィルターがアクションに Index() 適用されます。 また、この属性をクラス自体に DataController 適用することもできます。 その場合、コントローラーによって公開されるアクションによって返される結果は、10 秒間キャッシュされます。

さまざまな種類のフィルター

ASP.NET MVC フレームワークでは、次の 4 種類のフィルターがサポートされています。

  1. 承認フィルター – 属性を IAuthorizationFilter 実装します。
  2. アクション フィルター – 属性を IActionFilter 実装します。
  3. 結果フィルター – 属性を IResultFilter 実装します。
  4. 例外フィルター – 属性を IExceptionFilter 実装します。

フィルターは、上記の順序で実行されます。 たとえば、承認フィルターは常にアクション フィルターの前に実行され、例外フィルターは常に他のすべての種類のフィルターの後に実行されます。

承認フィルターは、コントローラー アクションの認証と承認を実装するために使用されます。 たとえば、Authorize フィルターは Authorization フィルターの例です。

アクション フィルターには、コントローラー アクションの実行前と実行後に実行されるロジックが含まれます。 たとえば、アクション フィルターを使用して、コントローラー アクションから返されるビュー データを変更できます。

結果フィルターには、ビューの結果が実行される前と後に実行されるロジックが含まれます。 たとえば、ビューがブラウザーにレンダリングされる直前に、ビューの結果を変更できます。

例外フィルターは、実行するフィルターの最後の種類です。 例外フィルターを使用して、コントローラー アクションまたはコントローラー アクションの結果によって発生したエラーを処理できます。 例外フィルターを使用してエラーをログに記録することもできます。

フィルターの種類はそれぞれ、特定の順序で実行されます。 同じ種類のフィルターを実行する順序を制御する場合は、フィルターの Order プロパティを設定できます。

すべてのアクション フィルターの基本クラスは クラス System.Web.Mvc.FilterAttribute です。 特定の種類のフィルターを実装する場合は、基本 Filter クラスを継承し、1 つ以上の IAuthorizationFilter、IActionFilter、IResultFilter、または ExceptionFilter インターフェイスを実装するクラスを作成する必要があります。

Base ActionFilterAttribute クラス

カスタム アクション フィルターを実装しやすくするために、ASP.NET MVC フレームワークには基本 ActionFilterAttribute クラスが含まれています。 このクラスは、 インターフェイスと IResultFilter インターフェイスの両方をIActionFilter実装し、 Filter クラスから継承します。

ここでの用語は完全に一貫性がありません。 技術的には、ActionFilterAttribute クラスを継承するクラスは、アクション フィルターと結果フィルターの両方です。 ただし、緩やかな意味では、アクション フィルターという単語は、ASP.NET MVC フレームワーク内の任意の種類のフィルターを参照するために使用されます。

基本の ActionFilterAttribute クラスには、オーバーライドできる次のメソッドがあります。

  • OnActionExecuting – このメソッドは、コントローラー アクションが実行される前に呼び出されます。
  • OnActionExecuted – このメソッドは、コントローラー アクションの実行後に呼び出されます。
  • OnResultExecuting – このメソッドは、コントローラー アクションの結果が実行される前に呼び出されます。
  • OnResultExecuted – このメソッドは、コントローラー アクションの結果が実行された後に呼び出されます。

次のセクションでは、これらの異なる各メソッドを実装する方法について説明します。

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

カスタム アクション フィルターを作成する方法を説明するために、コントローラー アクションの処理段階を Visual Studio の [出力] ウィンドウに記録するカスタム アクション フィルターを作成します。 当社 LogActionFilter はリスト2に含まれています。

リスト 2 – ActionFilters\LogActionFilter.vb

Public Class LogActionFilter
     Inherits ActionFilterAttribute

     Public Overrides Sub OnActionExecuting(ByVal filterContext As ActionExecutingContext)
          Log("OnActionExecuting", filterContext.RouteData)

     End Sub

     Public Overrides Sub OnActionExecuted(ByVal filterContext As ActionExecutedContext)
          Log("OnActionExecuted", filterContext.RouteData)
     End Sub

     Public Overrides Sub OnResultExecuting(ByVal filterContext As ResultExecutingContext)
          Log("OnResultExecuting", filterContext.RouteData)
     End Sub

     Public Overrides Sub OnResultExecuted(ByVal filterContext As ResultExecutedContext)
          Log("OnResultExecuted", filterContext.RouteData)
     End Sub

     Private Sub Log(ByVal methodName As String, ByVal routeData As RouteData)
          Dim controllerName = routeData.Values("controller")
          Dim actionName = routeData.Values("action")
          Dim message = String.Format("{0} controller:{1} action:{2}", methodName, controllerName, actionName)
          Debug.WriteLine(message, "Action Filter Log")
     End Sub

End Class

リスト 2 では、OnActionExecuting()OnActionExecuted()OnResultExecuting()、および OnResultExecuted() のすべてのメソッドが メソッドをLog()呼び出します。 メソッドの名前と現在のルート データが メソッドに Log() 渡されます。 メソッドは Log() 、Visual Studio の [出力] ウィンドウにメッセージを書き込みます (図 2 を参照)。

Visual Studio の [出力] ウィンドウへの書き込み

図 02: Visual Studio 出力ウィンドウへの書き込み (フルサイズの画像を表示する をクリックします)

リスト 3 のホーム コントローラーは、コントローラー クラス全体にログ アクション フィルターを適用する方法を示しています。 Home コントローラーによって公開されているアクション (メソッドまたはAbout()メソッド) Index() が呼び出されるたびに、アクションの処理ステージが Visual Studio の [出力] ウィンドウに記録されます。

リスト 3 – Controllers\HomeController.vb

<LogActionFilter()> _
Public Class HomeController
     Inherits System.Web.Mvc.Controller

     Function Index()
          Return View()
     End Function

     Function About()
          Return View()
     End Function

            End Class

まとめ

このチュートリアルでは、MVC アクション フィルターの ASP.NET について説明しました。 4 種類のフィルター (承認フィルター、アクション フィルター、結果フィルター、例外フィルター) について学習しました。 また、基本 ActionFilterAttribute クラスについても学習しました。

最後に、単純なアクション フィルターを実装する方法について学習しました。 コントローラー アクションの処理段階を Visual Studio の [出力] ウィンドウに記録するログ アクション フィルターを作成しました。