2011-07-13 4 views
13

私はすべてのページリクエストで特定のIDの存在をセッションでチェックする必要があるシナリオを持っています。これが見つかった場合は、データベースから関連オブジェクトを取得し、コントローラで使用できるようにする必要があります。セッションIDが見つからない場合は、ユーザーをリダイレクトする必要があります(セッションは期限切れです)。ASP.NET MVC:コントローラー変数を設定するアクションフィルター?

現時点では、コントローラ内のすべてのアクションメソッドの開始時にこれを行うコードのカスタムチャンクがあります。これは不要な繰り返しのようです。

このシナリオはアクションフィルターに適していますか?

おかげ

UPDATE ここにいくつかの素晴らしい情報男。ありがとうございました

答えて

8

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

アクションフィルタからアクションにデータを渡す場合は、ASP.NET MVC Pass object from Custom Action Filter to Actionを参照してください。

+0

1から供給されたパラメータに依存しており、2番目の段落内のリンクをありがとうございましたように、そのオブジェクトがさらに

//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 } } 

ShoppingCartの

であると仮定し、これはより多くのユニットテスト可能と明確な方法は、ある - かかりました同じような問題のために私が必要としていたことに私は正しい。 – Funka

8

この

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 
      }  
     } 
    } 

のようなベースコントローラを作成します。今もう一つの方法は、モデルバインダーでそれを行うことです。この

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

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

     } 
} 
+1

私はMVCをほぼ4年間使用していて、 'Initialize'メソッドについて知りませんでした。ありがとうございます!私はいつもこのようなロジックをベースコントローラーの 'OnActionExecuting'メソッドに入れていましたが、今は' Initialize'がより理想的なようです。これは、すべてのコントローラプロパティが呼び出されるまでに完全に準備ができていないので、コンストラクタが失敗するためです。怠け者のために、 'Initialize'のIntellisenseは、"コンストラクタが呼び出されたときに利用できないかもしれないデータを初期化します "と言っています。再びありがとう! – Funka

3

のようなウルのコントローラを作成します。このようにアクションが外

関連する問題