フィルタ機能~その1
ASP.NET MVCでは、フィルタ属性と呼ばれる機能があります。Controllerの呼び出しの前後に宣言されたフィルタ属性のコードを適用できるのが、特徴です。ASP.NET MVC Preview 4の段階では大きく分けて4種類のフィルタがあります。
- ActionFilterAttributeをオーバーライドして作成する独自のフィルタ
- ASP.NETのOutputCacheを利用したフィルタ
- リクエスト時にエラーが発生した場合のHandleErrorフィルタ
- 認証による閲覧制御を行うAuthorizeフィルタ
これらのフィルタはControllerクラス自身か、Controllerクラスのメソッドに対して、属性クラスとして適用できます。それぞれを活用することで、より開発効率を向上できます。
独自のフィルタ
ActionFilterAttributeクラスは、ASP.NET MVCにおけるフィルタを適用するために作られたひな形の属性クラスで、以下のメンバを含みます。
| メソッド | 概要 |
| OnActionExecutedメソッド | Action前に適用されるフィルタ |
| OnActionExecutingメソッド | Action後に適用されるフィルタ |
| OnResulteExecutedメソッド | Result前に適用されるフィルタ |
| OnResultExecutingメソッド | Result後に適用されるフィルタ |
前述したように、これらのメソッドはひな型なので、自分でオーバーライドし、必要な形に処理を記述する必要があります。
ASP.NET MVCにおける利用例としては、「Model」フォルダにActionFilterAttributeクラスを継承したクラスを作成し、フィルタをかけたい処理を記述します。以下は、認証ユーザー以外のユーザーに対して、警告を表示するフィルタです。
using System.Web.Mvc; using System.Security; namespace SampleMVCPreview4.Models { // ActionFilterAttributeフィルタを継承した独自のフィルタ public class UserFilterAttribute : ActionFilterAttribute { // ActionExecutingContextという // Action実行時のコンテキストがパラメタ // OnActionExecutingAction実行時のメソッド public override void OnActionExecuted(ActionExecutedContextfilterContext) { // ユーザー"naoki"以外の時にセキュリティ例外 if (filterContext.HttpContext.User.Identity.Name != "naoki") hrow new SecurityException("naokiしか閲覧できません!"); } } }
作成したフィルタは、Controllerクラスファイル内で、属性クラスとして適用できます。以下は、PubsControllerクラスのinfoメソッドにフィルタを適用した例です。
using SampleMVCPreview4.Models; <中略> [UserFilter] // URLはhttp://xxx/Pubs/info/id public ActionResult info(string id) { // titlesテーブルの中からtitle_idが // パラメタのidと同等の項目を取得 var pubs = from t in pubsdatacontext.titles where t.title_id == id select t; // ブラウザのタイトルにパラメタの表示を行う ViewData["Title"] = "Information :"+id; // details.aspxページに上記のLINQ結果を // パラメタとしてルーティング return View("details", pubs.ToList()); }
上記の設定を行った場合、infoメソッドには、”naoki”以外のユーザーがアクセスしようとした場合にセキュリティエラーが発生します。
ロールや認証ユーザー以外にもフィルタを適用し、アプリケーションに適用できるので、使う場面も多くなるかと思います。

filterContext)
{