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