2011-06-30 12 views
0

の一つのパラメータをバインドしないでください。 idを呼び出してモデルをデータベースから取得します。は、私はこのようになります行動をしたアクション

のActionFilterは次のようになります。

... 
public override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
    // parse the id from the request 
    MyModel model = getModelFromDataStoreById(id); 
    filterContext.ActionParameters["model"] = model; 
} 
... 

問題がmymodelというオブジェクトがパラメータなしのコンストラクタを持っていないことである、とのActionFilterがさえ呼ばれる前に、MVCの作成とmymodelというオブジェクトにバインドしようとしていますMyModelオブジェクトをインスタンス化できないため、例外がスローされます。

私の最初の質問は、私がこれを正しくやっているか、HttpContext.Itemsのようなものを使ってフィルタとアクションの間でデータをやりとりするべきでしょうか?次に、MVCにMyModelオブジェクトをバインドしようとしないように指示する方法はありますか?それは後で作成されるからです。

+1

MyModelオブジェクトをバインドしたくない場合thodが呼び出されたら、なぜあなたはそれをパラメータリストに入れていますか?また、カスタムアクションフィルタに精通していますか?アクションのモデルにアクセスして、途中または途中でアクションモデルを作成できます。 – mccow002

+0

ActionParameters経由でActionFilterからControllerにオブジェクトを渡すことを選択しました。それは私にとって最も簡潔で読みやすい解決策のようです。モデルオブジェクトはアクションのモデルではありません。私のビジネスロジックオブジェクトは、私がJSONResultを返してからアクションを実行します。 – Evan

+0

なぜ、アクション自体でアクションフィルタで実行されているロジックを実行できないのですか?アクションフィルターは、さまざまなアクションで実行する必要のあるコードがある場合に使用されます。 DRYプリンシパルを実行するのに役立ちます。しかし、あなたの場合、これはこの1つの動作に固有のように見えます。では、アクション内でgetModelFromDataStoreByIdメソッドを呼び出すだけではどうですか? – mccow002

答えて

2

カスタムモデルバインダーは、カスタムアクションフィルタよりも、このタスクのためのより適切なようだ:

yuoは Application_Startに登録します
public class MyModelBinder : DefaultModelBinder 
{ 
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) 
    { 
     var id = bindingContext.ValueProvider.GetValue("id"); 
     if (id != null) 
     { 
      return GetModelFromDataStoreById(id.AttemptedValue); 
     } 
     return base.CreateModel(controllerContext, bindingContext, modelType); 
    } 
} 

ModelBinders.Binders.Add(typeof(MyModel), new MyModelBinder()); 

今すぐあなたのコントローラのアクションは、次のようになります。

[HttpPost] 
public ActionResult ChangeName(string name, MyModel model) 
{ 
    try 
    { 
     model.ChangeName(); 
     return JSONSuccess(); 
    } 
    catch (ModelUpdateException) 
    { 
     return JSONFail(); 
    } 
} 
関連する問題