ページ ASP.NET MVC:コントローラ変数を設定するためのアクションフィルタ




mvc5 @model (3)

このような基本コントローラを作成します

   public class MyContollerController : Controller
    {
        public DataEntity userData;
        protected override void Initialize(System.Web.Routing.RequestContext requestContext)
        {            
            base.Initialize(requestContext);
            var customId = requestContext.HttpContext.Session["key"];
            if(customId!=null)
            {
                 userData=getDataGromDataBase(customId);
            }   
            else
            {
               //redirect User
            }     
        }
    }

今このようなurコントローラを作成する

public class MyDemoController : MyContollerController
{
        public ActionResult Action1()
        { 
             //access your data
             this.userData

        }
        public ActionResult Action2()
        { 
             //access your data
             this.userData

        }
}

私はすべてのページリクエストで私は特定のIDの存在のセッションをチェックしなければならないというシナリオがあります。 これが見つかった場合は、データベースから関連オブジェクトを取得し、それをコントローラで利用できるようにする必要があります。 セッションIDが見つからない場合、ユーザーをリダイレクトする必要があります(セッションの有効期限が切れています)。

現時点で、私は私のコントローラ内のすべてのアクションメソッドの開始時にこれを行うカスタムコードの組(数行)を持っています - これは不必要な繰り返しのようです。

このシナリオはアクションフィルタの価値がありますか?

ありがとう

更新ここにいくつかの素晴らしい情報はみんな。 ありがとうございました


別の方法はモデルバインダーでそれをすることです。 オブジェクトがShoppingCartであるとします。

//Custom Model Binder
public class ShoppingCarModelBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            //TODO: retrieve model or return null;
        }
    }
 //register that binder in global.asax in application start

ModelBinders.Binders.Add(typeof(ShoppingCart), new ShoppingCartBinder());

// controller action

public ActionResult DoStuff(ShoppingCart cart)
{
     if(cart == null)
     {
     //whatever you do when cart is null, redirect. etc
     }
     else
     {
     // do stuff with cart
     }
}

さらに、これはアクションが外部から供給されたパラメータに依存するので、これはより単体テスト可能で明確な方法です。


はい、これはアクションフィルターの良い適用のように思えます、あなたはそれをコントローラーレベルで適用してすべてのアクションに作用することができるので。 手動ですべてのコントローラに追加したくない場合は、それをコントローラの基本クラスの一部にするか、このアクションフィルタを各コントローラに自動的に適用する独自のコントローラファクトリを作成することもできます。

アクションフィルターからアクションにデータを渡す方法については、 ASP.NET MVCカスタムアクションフィルターからアクションへのオブジェクトの受け渡しを参照してください。





action-filter