私は ASP.NET MVC2 アプリに取り組んでいます。私は、MVC が ModelState とモデル バインディングに関係して舞台裏で行っている、非常に驚くべき、しかし驚くべきことに気付きました。大量のデータを持つ ViewModel があります。一部のフィールドはフォームの一部であり、他のフィールドは単に UI の一部です。HttpPost では、私の Action メソッドは、モデル全体をバインドしようとする DefaultModelBinder を使用しますが、フォームの一部であったフィールドのみが正常に逆シリアル化され、その他はすべて null のままです。それはそれでいいし、理解できる。ModelState が無効な場合は、データベースからモデルを更新し、それらの特定のフォーム フィールドをバインドしてから、同じ編集ビューに戻って関連する ModelState 検証エラーを表示する必要があります。
ここで私の驚きと好奇心が生まれます。フォーム フィールドを更新されたモデルにバインドするUpdateModel()
には、またはを呼び出してTryUpdateModel<>()
、新しく更新されたモデルを渡す必要があると想定していました。例えば:
[HttpPost]
public ActionResult EditDetail(EditDetailItemModel model)
{
if (model.IsValid)
{
// Save the results to the db
return RedirectToAction(...)
}
// Can't simply "return View(model)". Not all fields in EditDetailItemModel
// were part of the form - thus they returned null. Have to refresh
// model from the db.
var refreshedModel = RefreshModelFromDB();
// Is this line necessary?????
TryUpdateModel<EditDetailItemModel>(refreshedModel);
return View(refreshedModel);
}
refreshedModel
しかし、私が見つけたのは、 を呼び出さずに単にビューに戻った場合TryUpdateModel<>()
、更新されたモデルが投稿されたフォーム フィールドの値に自動的にバインドされていたことです!! したがって、TryUpdateModel<>()
ここでは必要ありません。
私がそれを理解できる唯一の方法は、ModelState が無効な状態にあるため、更新されたモデルでビューを返すと、「MVC レンダリング エンジン」が ModelState エラーをループし、それらのプロパティ値を更新された値にバインドすることです。モデル。それは単に素晴らしいです!しかし、私はこの仮定の証明が必要です。これに関するドキュメントはウェブ上のどこにも見つかりません。なぜ/どのようにこの素晴らしい自動バインド動作が発生しているかという私の仮説を誰かが確認できますか、および/またはそれがなぜ/どのように発生しているかについて教えてくれますか?