我正在开发一个ASP.NET MVC2应用程序。我已经意识到MVC在幕后与ModelState和模型绑定有关的一个非常令人惊讶但令人惊奇的事情。我有一个ViewModel,它有一大堆数据 - 一些字段是表单的一部分,而其他字段只是UI的一部分。在HttpPost上,我的Action方法使用DefaultModelBinder来尝试绑定整个模型,但只有作为表单一部分的字段才能成功反序列化 - 所有其他字段保持为null。这很好,也可以理解。如果ModelState无效,我需要在返回到同一编辑视图以显示那些关联的ModelState验证错误之前,从db和 bind 这些特定表单字段刷新模型。
这是我惊讶和好奇的地方。我的假设是,为了让我使用刷新的模型绑定表单字段,我需要调用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错误并绑定这些属性值用我精神焕发的模特。这简直太棒了!但是,我想要证明这个假设。我无法在网络上的任何地方找到有关此内容的文档。任何人都可以确认我的假设为什么/如何发生这种令人敬畏的自动绑定行为和/或教育我为什么/如何发生,希望备份一些在线文档链接,以便我更全面地了解在幕后发生了什么?
答案 0 :(得分:0)
public ActionResult EditDetail(EditDetailItemModel model)
该行将执行模型绑定。将ActionMethod参数视为始终通过调用UpdateModel填充。
您没有在视图中看到refreshedModel的值,您将看到EditDetailItemModel中的ModelState条目和值。