ASP.NET MVCは、httppostでModelStateが無効である場合、更新されたモデルを自動バインドします
-
28-09-2019 - |
質問
ASP.NET MVC2アプリに取り組んでいます。私は、MVCがモデルステートとモデルの結合に関係している舞台裏で行う非常に驚くべきことでありながら驚くべきことに気付くようになりました。私はすべてのデータを持っているViewModelを持っています - いくつかのフィールドはフォームの一部であり、他のフィールドは単にUIの一部です。 httppostでは、私のアクション方法では、モデル全体をバインドしようとするデフォルトモデルビンダーを使用しますが、フォームの一部であったフィールドのみが正常に脱色されます - 他のすべてはnullのままです。それは大丈夫で理解しやすいです。 ModelStateが無効である場合は、そうする必要があります リフレッシュします DBからのモデル 練る 同じ編集ビューに戻る前のこれらの特定のフォームフィールドは、関連するモデルステート検証エラーを表示します。
これが私の驚きと好奇心が来るところです。私がするためにそれは私の仮定でした 練る リフレッシュされたモデルを備えたフォームフィールド、私はどちらに電話をかける必要がありました 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<>()
ここでは必要ありません!
私がそれを理解できる唯一の方法は、モデルステートが無効な状態にあるため、更新されたモデルでビューを返すと、「MVCレンダリングエンジン」がモデルステートエラーをループし、それらのプロパティ値をリフレッシュしてバインドすることです。モデル。それは単に素晴らしいです!しかし、私はこの仮定についての証拠を望んでいます。ウェブ上のどこにもこれに関するドキュメントが見つかりません。誰かが私の仮説を確認することができますか?
解決
public ActionResult EditDetail(EditDetailItemModel model)
そのラインはモデルバインディングを実行します。 ActionMethodパラメーターは、updateModelへの呼び出しによって常に入力されているように考えてください。
ビューでrefreshedModelの値が表示されていません。EditDetailitemModelのModelStateエントリと値が表示されています。