Я работаю над приложением ASP.NET MVC2.Я осознал очень удивительную, но удивительную вещь, которую MVC делает за кулисами, связанные с ModelState и связыванием модели.У меня есть ViewModel, которая имеет целую кучу данных - некоторые поля являются частью формы, а другие просто частью пользовательского интерфейса.В HttpPost мой метод Action использует DefaultModelBinder, который пытается связать всю модель, но только те поля, которые были частью формы, успешно десериализованы - все остальные остаются нулевыми.Это хорошо и понятно.Если 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 и связал эти значения свойств с моей обновленной моделью.Это просто УДИВИТЕЛЬНО!Но я хочу доказательства этого предположения.Я не могу найти документацию по этому вопросу в Интернете.Может ли кто-нибудь подтвердить мою гипотезу, ПОЧЕМУ / КАК происходит такое автоматическое связывание AWESOME, и / или научить меня, почему / как это происходит? Надеемся, что я подкреплю его некоторыми ссылками на онлайн-документацию, чтобы я лучше понял, что происходит под прикрытием?