2009-07-06 23 views
24

私は最初の.NET MVCアプリケーションで作業しており、NerdDinnerチュートリアルを参照ポイントとして使用しています。現時点で興味をそそられている点の1つはUpdateModel()です。 (私は本当に理解していないものを使用して好きではありません。)ASP.NET MVC UpdateModel()メソッドはどのように機能しますか?

NerdDinner tutorialから撮影 -

// 
// POST: /Dinners/Edit/2 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(int id, FormCollection formValues) { 

    Dinner dinner = dinnerRepository.GetDinner(id); 

    UpdateModel(dinner); 

    dinnerRepository.Save(); 

    return RedirectToAction("Details", new { id = dinner.DinnerID }); 
} 

私の主な質問UpdateModel()がEditメソッドに渡されたformValuesへのアクセスを取得しない方法です?コレクションがメソッドのパラメータとして明示的に渡されないのはなぜですか?

+0

Microsoftから[ASP.NET MVCソース](http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&displaylang=en)を入手して使用します。あなたのコードをステップ実行すること。あなたは彼らがどんな魔法をしているか正確に見ることができます: – mkchandler

+0

それはフォーム収集シナリオなどのためだけに機能しますか? – Krish

答えて

3

Form、QueryString、Cookies、Server変数などのHttpRequest入力をすべて検査します。私はこの順序で考える。

+0

'UpdateModel Function'は、フォーム収集シナリオの場合にのみ、または他の場合にも機能しますか? – Krish

24

UpdateModel()は、さまざまな入力データソース(View、QueryString値、セッション変数/ CookieなどからのHTTP POSTデータ)を指定した明示的モデルオブジェクトにバインドしようとするControllerヘルパメソッドですパラメータとして使用します。本質的には、それはモデル結合のためだけです。

強く型付けされたモデル(ビューモデルのような)としてアクションの入力パラメータを表現すると、UpdateModel()が呼び出されたときに舞台裏で行われたすべてのステップが既に完了しています。 DataContextからオブジェクトを取得してそのプロパティを編集すると、SaveChanges()だけでデータベースに更新を戻すことができます(この場合はSave())。

例:

// 
// POST: /Dinners/Edit/2 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(DinnerViewModel incoming) { 

    var dinner = dinnerRepository.GetDinner(incoming.DinnerID); 
    dinner.Description = incoming.Description; 
    dinnerRepository.Save(); 

    return RedirectToAction("Details", new { id = incoming.DinnerID }); 
} 

はしかし、強く型付けされたモデルとのUpdateModel()を使用するためのユースケースはあります:あなたは強く型付けされたモデルに渡すと、その値がしたいときエンティティのエンティティをデータベースから直接置き換えます(名前がすべて同じで型付けされている場合)。この場合、オブジェクトを取得し、その上でUpdateModel()を使用すると、モデルバインド操作によって、同様の名前の型付きのプロパティが厳密に型指定されたオブジェクトから取得されたオブジェクトに引き込まれます。つまり、の反映が実行されます。

あなたの例のように、更新するものを指定せずにすべてのプロパティを更新したい場合、強く型付けされたモデルとデータベースモデルには同様の名前のプロパティがありますが、UpdateModel()反射の

例:

// 
// POST: /Dinners/Edit/2 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(DinnerViewModel incoming) { 

    var dinner = dinnerRepository.GetDinner(incoming.DinnerID); 
    UpdateModel(dinner); 
    dinnerRepository.Save(); 

    return RedirectToAction("Details", new { id = incoming.DinnerID }); 
} 

(FormCollectionオブジェクトを使用してオーバー)ここでの唯一の利点は、あなたが(incoming.DinnerIDによって示されるように)強く型付けされたオブジェクトの他のすべてのプロパティにアクセスする必要があるだろうということです。

結論:強く型付けされたオブジェクトを派生オブジェクトに変換する場合は、おそらくUpdateModel()を使用するのが最も簡単です。ただし、派生オブジェクトのいくつかのプロパティを単純に更新するだけでは、ほとんど必要ありません。また、Linq to SQLの代わりにEntity Frameworkを使用すると、厳密に型指定されたオブジェクトと派生したオブジェクトを独自のメソッドで関連付けることができるため、このすべてが問題になることに注意してください。

+0

'UpdateModel Function'はフォーム収集シナリオなどにのみ有効ですか? – Krish

関連する問題