MVCフレームワーク-アクションフィルター

ASP.NET MVCでは、コントローラーはアクションメソッドを定義し、これらのアクションメソッドは通常、ボタンやリンクのクリックなど、UIコントロールと1対1の関係にあります。たとえば、前の例の1つであるUserControllerクラスに含まれるメソッドUserAdd、UserDeleteなど。

ただし、特定の操作の前後に何らかのアクションを実行したい場合がよくあります。この機能を実現するために、ASP.NET MVCは、コントローラーのアクションメソッドにアクション前後の動作を追加する機能を提供します。

フィルタの種類

ASP.NET MVCフレームワークは、次のアクションフィルターをサポートします-

  • Action Filters−アクションフィルターは、コントローラーアクションの実行の前後に実行されるロジックを実装するために使用されます。この章では、アクションフィルターについて詳しく説明します。

  • Authorization Filters −許可フィルターは、コントローラーアクションの認証と許可を実装するために使用されます。

  • Result Filters−結果フィルターには、ビュー結果の実行の前後に実行されるロジックが含まれています。たとえば、ビューがブラウザにレンダリングされる直前に、ビューの結果を変更したい場合があります。

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

アクションフィルターは、追加のデータ処理を実行したり、戻り値を操作したり、アクションの実行をキャンセルしたり、実行時にビュー構造を変更したりするために最も一般的に使用されるフィルターの1つです。

アクションフィルター

アクションフィルターは、コントローラーセクションまたはコントローラー全体に適用して、アクションの実行方法を変更できる追加の属性です。これらの属性は、System.Attributeから派生した特別な.NETクラスであり、クラス、メソッド、プロパティ、およびフィールドにアタッチできます。

ASP.NET MVCは、次のアクションフィルターを提供します-

  • Output Cache −このアクションフィルターは、コントローラーアクションの出力を指定された時間キャッシュします。

  • Handle Error −このアクションフィルターは、コントローラーアクションの実行時に発生するエラーを処理します。

  • Authorize −このアクションフィルターを使用すると、特定のユーザーまたはロールへのアクセスを制限できます。

次に、これらのフィルターをサンプルコントローラーActionFilterDemoControllerに適用するコード例を示します。(ActionFilterDemoControllerは例として使用されています。これらのフィルターは、どのコントローラーでも使用できます。)

出力キャッシュ

Example −10秒間キャッシュする戻り値を指定します。

public class ActionFilterDemoController : Controller { 
   [HttpGet] 
   OutputCache(Duration = 10)] 
   
   public string Index() { 
      return DateTime.Now.ToString("T");  
   } 
}

エラーの処理

Example −コントローラーによってエラーがトリガーされると、アプリケーションをカスタムエラーページにリダイレクトします。

[HandleError] 
public class ActionFilterDemoController : Controller { 
   
   public ActionResult Index() { 
      throw new NullReferenceException(); 
   }  
   
   public ActionResult About() { 
      return View(); 
   } 
}

上記のコードでは、アクションの実行中にエラーが発生した場合、ViewsフォルダーでErrorという名前のビューが検索され、そのページがユーザーに表示されます。

承認する

Example −許可されたユーザーのみがアプリケーションにログインできるようにします。

public class ActionFilterDemoController: Controller { 
   [Authorize] 
   
   public ActionResult Index() { 
      ViewBag.Message = "This can be viewed only by authenticated users only"; 
      return View(); 
   }  
   
   [Authorize(Roles="admin")] 
   public ActionResult AdminIndex() { 
      ViewBag.Message = "This can be viewed only by users in Admin role only"; 
      return View(); 
   } 
}

上記のコードで、ログインせずにアプリケーションにアクセスしようとすると、次のスクリーンショットに示すようなエラーがスローされます。