Mvc-framework-action-filters
MVCフレームワーク-アクションフィルター
ASP.NET MVCでは、コントローラーはアクションメソッドを定義し、これらのアクションメソッドは通常、ボタンやリンクのクリックなど、UIコントロールと1対1の関係を持ちます。 たとえば、前の例の1つでは、UserControllerクラスにUserAdd、UserDeleteなどのメソッドが含まれていました。
ただし、特定の操作の前後に何らかのアクションを実行したい場合がよくあります。 この機能を実現するために、ASP.NET MVCは、コントローラーのアクションメソッドにアクション前およびアクション後の動作を追加する機能を提供します。
フィルターの種類
ASP.NET MVCフレームワークは、次のアクションフィルターをサポートしています-
- アクションフィルター-アクションフィルターは、コントローラーアクションの実行前後に実行されるロジックを実装するために使用されます。 この章では、アクションフィルターについて詳しく説明します。
- 承認フィルター-承認フィルターは、コントローラーアクションの認証と承認を実装するために使用されます。
- 結果フィルター-結果フィルターには、ビュー結果の実行前後に実行されるロジックが含まれます。 たとえば、ビューがブラウザにレンダリングされる直前に、ビューの結果を変更できます。
- 例外フィルター-例外フィルターは、実行する最後のタイプのフィルターです。 例外フィルターを使用して、コントローラーアクションまたはコントローラーアクションの結果によって発生したエラーを処理できます。 例外フィルターを使用してエラーを記録することもできます。
アクションフィルターは、追加のデータ処理を実行したり、実行時に戻り値を操作したり、アクションの実行をキャンセルしたり、ビュー構造を変更したりするために最もよく使用されるフィルターの1つです。
アクションフィルター
アクションフィルターは、コントローラーセクションまたはコントローラー全体に適用して、アクションの実行方法を変更できる追加の属性です。 これらの属性は、System.Attributeから派生した特別な.NETクラスであり、クラス、メソッド、プロパティ、およびフィールドに添付できます。
ASP.NET MVCは、次のアクションフィルターを提供します-
- 出力キャッシュ-このアクションフィルターは、指定された時間、コントローラーアクションの出力をキャッシュします。
- Handle Error -このアクションフィルターは、コントローラーアクションの実行時に発生したエラーを処理します。
- Authorize -このアクションフィルターを使用すると、特定のユーザーまたはロールへのアクセスを制限できます。
次に、これらのフィルターをサンプルのコントローラーActionFilterDemoControllerに適用するコード例を見てみましょう。 (ActionFilterDemoControllerは例として使用されています。 これらのフィルターはどのコントローラーでも使用できます。)
出力キャッシュ
例-10秒間キャッシュする戻り値を指定します。
public class ActionFilterDemoController : Controller {
[HttpGet]
OutputCache(Duration = 10)]
public string Index() {
return DateTime.Now.ToString("T");
}
}
エラー処理
例-エラーがコントローラーによってトリガーされたときに、アプリケーションをカスタムエラーページにリダイレクトします。
[HandleError]
public class ActionFilterDemoController : Controller {
public ActionResult Index() {
throw new NullReferenceException();
}
public ActionResult About() {
return View();
}
}
上記のコードを使用すると、アクションの実行中にエラーが発生すると、ViewsフォルダーでErrorという名前のビューが検出され、そのページがユーザーに表示されます。
承認する
例-承認されたユーザーのみにアプリケーションへのログインを許可します。
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();
}
}
上記のコードでは、ログインせずにアプリケーションにアクセスしようとすると、次のスクリーンショットに示すようなエラーがスローされます。