アクション フィルターについて理解する (VB)
このチュートリアルの目的は、アクション フィルターについて説明することです。 アクション フィルターは、アクションの実行方法を変更するコントローラー アクション (またはコントローラー全体) に適用できる属性です。
アクション フィルターについて
このチュートリアルの目的は、アクション フィルターについて説明することです。 アクション フィルターは、アクションの実行方法を変更するコントローラー アクション (またはコントローラー全体) に適用できる属性です。 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 種類のフィルターがサポートされています。
- 承認フィルター – 属性を
IAuthorizationFilter
実装します。 - アクション フィルター – 属性を
IActionFilter
実装します。 - 結果フィルター – 属性を
IResultFilter
実装します。 - 例外フィルター – 属性を
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 を参照)。
図 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 の [出力] ウィンドウに記録するログ アクション フィルターを作成しました。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示