Asp.net-mvc-filters

提供:Dev Guides
移動先:案内検索

ASP.NET MVC-フィルター

ASP.NET MVCでは、コントローラーは通常、ユーザーインタラクションと1対1の関係を持つアクションメソッドを定義しますが、アクションメソッドが呼び出される前またはアクションメソッドの実行後にロジックを実行したい場合があります。

これをサポートするために、ASP.NET MVCはフィルターを提供します。 *フィルター*は、事前アクションと事後アクションの動作をコントローラーアクションメソッドに追加する宣言的およびプログラム的な手段を提供するカスタムクラスです。

アクションフィルター

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

  • OutputCache -指定した量のコントローラーアクションの出力をキャッシュします 時間。
  • HandleError -コントローラアクションが実行されたときに発生したエラーを処理します。
  • Authorize -特定のユーザーまたはロールへのアクセスを制限できます。

フィルターの種類

ASP.NET MVCフレームワークは、フィルタの4つの異なるタイプをサポートしています-

  • Authorization Filters -IAuthorizationFilter属性を実装します。
  • アクションフィルター-IActionFilter属性を実装します。
  • 結果フィルター-IResultFilter属性を実装します。
  • Exception Filters -IExceptionFilter属性を実装します。

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

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

新しいASP.Net MVCプロジェクトを作成して、簡単な例を見てみましょう。

  • ステップ1 *-Visual Studioを開き、[ファイル]→[新規]→[プロジェクト]メニューオプションをクリックします。

新しいプロジェクトダイアログが開きます。

新しいプロジェクトメニューオプション

  • ステップ2 *-左ペインから、テンプレート→Visual C#→Webを選択します。
  • ステップ3 *-中央のペインで、ASP.NET Webアプリケーションを選択します。
  • ステップ4 *-[名前]フィールドにプロジェクト名MVCFiltersDemoを入力し、[OK]をクリックして続行すると、ASP.NETプロジェクトの初期コンテンツを設定するよう求める次のダイアログが表示されます。

MVCFiltersDemo

  • ステップ5 *-簡単にするために、[空にする]オプションを選択し、[フォルダーとコア参照を追加する]セクションの[MVC]チェックボックスをオンにして[OK]をクリックします。

最小限の定義済みコンテンツで基本的なMVCプロジェクトを作成します。

  • ステップ6 *-コントローラーを追加するには、ソリューションエクスプローラーでコントローラーフォルダーを右クリックし、[追加]→[コントローラー]を選択します。

[足場の追加]ダイアログが表示されます。

コントローラーの足場追加ダイアログ

  • ステップ7 *-MVC 5 Controller – Emptyオプションを選択し、「追加」ボタンをクリックします。

[コントローラーの追加]ダイアログが表示されます。

コントローラーの追加ダイアログ

  • ステップ8 *-名前をHomeControllerに設定し、[追加]ボタンをクリックします。

Controllersフォルダーに新しいC#ファイル「HomeController.cs」が表示されます。このフォルダーはVisual Studioでも編集用に開かれています。

アクションフィルターを適用

アクションフィルターは、個々のコントローラーアクションまたはコントローラー全体に適用できます。 たとえば、アクションフィルタ OutputCache は、文字列を返すIndex()という名前のアクションに適用されます。 このフィルターにより、アクションによって返される値が15秒間キャッシュされます。

これを実用的な例にするには、次のコードを使用して Index というアクションメソッドを変更し、コントローラークラスを変更します。

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCFiltersDemo.Controllers {
   public class HomeController : Controller{
     //GET: Home
      [OutputCache(Duration = 15)]

      public string Index(){
         return "This is ASP.Net MVC Filters Tutorial";
      }
   }
}

このアプリケーションを実行すると、ブラウザがIndexアクションメソッドの結果を表示していることがわかります。

MVCフィルターチュートリアル

別のアクションメソッドを追加して、現在の時刻を表示します。

namespace MVCFiltersDemo.Controllers{
   public class HomeController : Controller{
     //GET: Home

      [OutputCache(Duration = 15)]
      public string Index(){
         return "This is ASP.Net MVC Filters Tutorial";
      }

      [OutputCache(Duration = 20)]
      public string GetCurrentTime(){
         return DateTime.Now.ToString("T");
      }
   }
}

次のURL、 http://localhost:62833/Home/GetCurrentTime を要求すると、次の出力が表示されます。

Localhost GetCurrentTime

ブラウザを更新すると、アクションが20秒間キャッシュされるため、同じ時間が表示されます。 20秒後に更新すると更新されます。

カスタムフィルター

独自のカスタムフィルターを作成するために、ASP.NET MVCフレームワークはActionFilterAttributeと呼ばれる基本クラスを提供します。 このクラスは、IActionFilterインターフェイスとIResultFilterインターフェイスの両方を実装し、どちらもFilterクラスから派生しています。

ActionFiltersを使用してプロジェクトに新しいフォルダーを作成することにより、カスタムフィルターの簡単な例を見てみましょう。 ActionFiltersフォルダーを右クリックして1つのクラスを追加し、追加→クラスを選択します。

カスタムフィルター

名前フィールドに「MyLogActionFilter」と入力し、「追加」ボタンをクリックします。

このクラスは、基本クラスであり、次のメソッドをオーバーライドする ActionFilterAttribute から派生します。 以下は、MyLogActionFilterの完全な実装です。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MVCFiltersDemo.ActionFilters {
   public class MyLogActionFilter : ActionFilterAttribute{
      public override void OnActionExecuting(ActionExecutingContext filterContext){
         Log("OnActionExecuting", filterContext.RouteData);
      }

      public override void OnActionExecuted(ActionExecutedContext filterContext){
         Log("OnActionExecuted", filterContext.RouteData);
      }

      public override void OnResultExecuting(ResultExecutingContext filterContext){
         Log("OnResultExecuting", filterContext.RouteData);
      }

      public override void OnResultExecuted(ResultExecutedContext filterContext){
         Log("OnResultExecuted", filterContext.RouteData);
      }

      private void Log(string methodName, RouteData routeData){
         var controllerName = routeData.Values["controller"];
         var actionName = routeData.Values["action"];

         var message = String.Format(
            "{0} controller:{1} action:{2}", methodName, controllerName, actionName);

         Debug.WriteLine(message, "Action Filter Log");
      }
   }
}

次のコードを使用して、HomeControllerにログフィルターを適用します。

using MVCFiltersDemo.ActionFilters;
using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCFiltersDemo.Controllers {
   [MyLogActionFilter]
   public class HomeController : Controller{
     //GET: Home

      [OutputCache(Duration = 10)]
      public string Index(){
         return "This is ASP.Net MVC Filters Tutorial";
      }

      [OutputCache(Duration = 10)]
      public string GetCurrentTime(){
         return DateTime.Now.ToString("T");
      }
   }
}

アプリケーションを実行してから、出力ウィンドウを観察します。

出力ウィンドウ

上記のスクリーンショットに見られるように、アクションを処理する段階はVisual Studioの出力ウィンドウに記録されます。