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

提供元: Microsoft

PDF のダウンロード

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

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

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

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

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

このチュートリアルでは、アクション フィルターを最初からビルドする方法について説明します。 アクションの処理のさまざまなステージを 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

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

Cached time

図 01: キャッシュされた時刻 (クリックしてフルサイズの画像を表示します)

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

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

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

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

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

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

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

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

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

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

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

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

Base ActionFilterAttribute クラス

カスタム アクション フィルターを簡単に実装できるようにするために、ASP.NET MVC フレームワークには基本 ActionFilterAttribute クラスが含まれています。 このクラスは、IActionFilter インターフェイスと IResultFilter インターフェイスの両方を実装し、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 を参照)。

Writing to the Visual Studio Output window

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

リスト 3 のホーム コントローラーは、コントローラー クラス全体にログ アクション フィルターを適用する方法を示します。 ホーム コントローラーによって公開されているアクションのいずれかが呼び出されるたびに (Index() メソッドまたは About() メソッド)、アクションの処理ステージが 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

まとめ

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

最後に、単純なアクション フィルターを実装する方法も説明しました。 コントローラー アクションの処理ステージを Visual Studio の [出力] ウィンドウに記録するログ アクション フィルターを作成しました。