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を使用すると、厳密に型指定されたオブジェクトと派生したオブジェクトを独自のメソッドで関連付けることができるため、このすべてが問題になることに注意してください。
Microsoftから[ASP.NET MVCソース](http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&displaylang=en)を入手して使用します。あなたのコードをステップ実行すること。あなたは彼らがどんな魔法をしているか正確に見ることができます: – mkchandler
それはフォーム収集シナリオなどのためだけに機能しますか? – Krish