アクション フィルターについて理解する (VB)
提供元: Microsoft
このチュートリアルの目的は、アクション フィルターについて説明することです。 アクション フィルターは、アクションの実行方法を変更するコントローラー アクション (またはコントローラー全体) に適用できる属性です。
アクション フィルターについて
このチュートリアルの目的は、アクション フィルターについて説明することです。 アクション フィルターは、アクションの実行方法を変更するコントローラー アクション (またはコントローラー全体) に適用できる属性です。 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 を参照)。
図 01: キャッシュされた時刻 (クリックしてフルサイズの画像を表示します)
リスト 1 では、1 つのアクション フィルター (OutputCache
アクション フィルター) が Index()
メソッドに適用されます。 必要に応じて、同じアクションに複数のアクション フィルターを適用できます。 たとえば、同じアクションに OutputCache
アクション フィルターと HandleError
アクション フィルターの両方を適用できます。
リスト 1 では、OutputCache
アクション フィルターが Index()
アクションに適用されます。 また、この属性を DataController
クラス自体に適用することもできます。 その場合、コントローラーによって公開されるアクションによって返される結果は、10 秒間キャッシュされます。
さまざまな種類のフィルター
ASP.NET MVC フレームワークでは、次の 4 種類のフィルターがサポートされています。
- 承認フィルター –
IAuthorizationFilter
属性を実装します。 - アクション フィルター –
IActionFilter
属性を実装します。 - 結果フィルター –
IResultFilter
属性を実装します。 - 例外フィルター –
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 を参照)。
図 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 の [出力] ウィンドウに記録するログ アクション フィルターを作成しました。