「ASP.NET MVC/フィルター」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
imported>Administrator
imported>Fallout New Tokyo
 
(同じ利用者による、間の1版が非表示)
1行目: 1行目:
 
[[ASP.NET MVC]]の'''フィルター'''とは、コントローラークラスやアクションメソッド(コントローラークラスのメソッド)に、[[属性]](Attribute)もちいて処理を挿入する機能のことである。
 
[[ASP.NET MVC]]の'''フィルター'''とは、コントローラークラスやアクションメソッド(コントローラークラスのメソッド)に、[[属性]](Attribute)もちいて処理を挿入する機能のことである。
  
たとえばユーザー認証処理がされている、されていない、などの処理を[[アクション]]ごとに書いていたのでは面倒、かつ本流ではないソースコードが入りまくり見通しが悪くなるのでフィルター化しておくと便利だという。
+
== 使い道の例 ==
 +
[[アクション]]ごとにユーザー認証処理が「されている」「されていない」などの処理を書いていたのでは面倒、かつ本流ではない[[ソースコード]]が入りまくり見通しが悪くなるのでフィルター化しておくと便利だという。
  
== 使い道の例 ==
+
たとえばEditアクションはログインしているユーザーのみ使えるとする場合は、以下のようにEditアクションにAuthorizeフィルター(アトリビュート)を付ける。
たとえばEditアクションはログインしているユーザーのみとする場合は以下のようになる。
 
 
<source lang="csharp">
 
<source lang="csharp">
 
[Authorize]
 
[Authorize]
17行目: 17行目:
  
 
== フィルターの種類 ==
 
== フィルターの種類 ==
[[ASP.NET MVC]]のフィルターは大きく、承認フィルター、アクションフィルター、結果フィルター、例外フィルターの4つに分けられる。
+
[[ASP.NET MVC]]のフィルターは大きく分けて、承認フィルター、アクションフィルター、結果フィルター、例外フィルターの4つに分けられる。
  
 
=== 承認フィルター ===
 
=== 承認フィルター ===
88行目: 88行目:
 
     public override void OnActionExecuting(ActionExecutingContext filterContext)
 
     public override void OnActionExecuting(ActionExecutingContext filterContext)
 
     {
 
     {
         filterContext.HttpContext.Trace.Write("(Logging Filter)Action Executing: " +
+
         filterContext.HttpContext.Trace.Write(
             filterContext.ActionDescriptor.ActionName);
+
            "(Logging Filter)Action Executing: "
 +
             + filterContext.ActionDescriptor.ActionName);
  
 
         base.OnActionExecuting(filterContext);
 
         base.OnActionExecuting(filterContext);
98行目: 99行目:
 
     {
 
     {
 
         if (filterContext.Exception != null)
 
         if (filterContext.Exception != null)
 +
        {
 
             filterContext.HttpContext.Trace.Write("(Logging Filter)Exception thrown");
 
             filterContext.HttpContext.Trace.Write("(Logging Filter)Exception thrown");
 +
        }
  
 
         base.OnActionExecuted(filterContext);
 
         base.OnActionExecuted(filterContext);
110行目: 113行目:
  
 
== 参考文献 ==
 
== 参考文献 ==
<references/>
+
{{reflist}}
== 外部リンク ==
 
  
 
{{stub}}
 
{{stub}}

2014年3月6日 (木) 06:00時点における最新版

ASP.NET MVCフィルターとは、コントローラークラスやアクションメソッド(コントローラークラスのメソッド)に、属性(Attribute)もちいて処理を挿入する機能のことである。

使い道の例[編集 | ソースを編集]

アクションごとにユーザー認証処理が「されている」「されていない」などの処理を書いていたのでは面倒、かつ本流ではないソースコードが入りまくり見通しが悪くなるのでフィルター化しておくと便利だという。

たとえばEditアクションはログインしているユーザーのみ使えるとする場合は、以下のようにEditアクションにAuthorizeフィルター(アトリビュート)を付ける。

[Authorize]
public ActionResult Edit(int id)
{
    //...
    return View();
}

ASP.NET MVCでは上記のAuthorize属性をはじめ、OutputCache属性やChildActionOnly属性、HandleError属性など、さまざまなフィルターがあらかじめ用意されている。またフィルターは自作することも可能である。

フィルターの種類[編集 | ソースを編集]

ASP.NET MVCのフィルターは大きく分けて、承認フィルター、アクションフィルター、結果フィルター、例外フィルターの4つに分けられる。

承認フィルター[編集 | ソースを編集]

IAuthorizationFilterインターフェイスを実装し、認証に関わる処理を記述する。

アクションフィルター[編集 | ソースを編集]

IActionFilterインターフェイスを実装し、アクションメソッドの実行前後で行われるべき処理を記述する。

結果フィルター[編集 | ソースを編集]

IResultFilterインターフェイスを実装し、ActionResultの実行前後(ビューエンジンの実行前後)に行われるべき処理を記述する。

例外フィルター[編集 | ソースを編集]

IExceptionFilterインターフェイスを実装し、例外発生時に行われるべき処理を記述する。

フィルターの実行順序[編集 | ソースを編集]

承認フィルター
 ↓
アクションフィルター前処理
 ↓
アクションメソッド
 ↓
アクションフィルター後処理
 ↓
結果フィルター前処理
 ↓
ビューエンジン
 ↓
結果フィルター後処理

その他:例外フィルター

標準フィルター[編集 | ソースを編集]

ASP.NET MVCにはあらかじめいくつかフィルターが用意されている。なお、MSDNのドキュメントでは「実装例」と繰り返し書かれてる。

  • AuthorizeAttribute - 承認フィルター
  • OutputCacheAttribute - 結果フィルター
  • HandleErrorAttribute - 例外フィルター


独自フィルター[編集 | ソースを編集]

自前の独自フィルターを作成するには、基本的にFilterAttributeクラスを継承し、前述のフィルターの種類に応じたインターフェイスを実装する。

たとえば標準フィルターのAuthorizeAttributeであれば以下のようになっている。

[AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute
  : FilterAttribute,      // FilterAttributeを継承して
    IAuthorizationFilter  // IAuthorizationFilterを実装する
{
    //...
}

なお、一般的なアクションフィルターであればActionFilterAttributeクラスという便利クラスもあるので、そちらを継承して使った方が手っ取り早い。

public class LoggingFilterAttribute : ActionFilterAttribute
{
    // アクションフィルター前処理
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.HttpContext.Trace.Write(
            "(Logging Filter)Action Executing: "
            + filterContext.ActionDescriptor.ActionName);

        base.OnActionExecuting(filterContext);
    }

    // アクションフィルター後処理
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Exception != null)
        {
            filterContext.HttpContext.Trace.Write("(Logging Filter)Exception thrown");
        }

        base.OnActionExecuted(filterContext);
    }
}

関連項目[編集 | ソースを編集]

参考文献[編集 | ソースを編集]