ASP.NET MVC автоматически связывает обновленную модель, когда ModelState недопустим на HttpPost - PullRequest
4 голосов
/ 02 ноября 2010

Я работаю над приложением 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, и / или научить меня, почему / как это происходит? Надеемся, что я подкреплю его некоторыми ссылками на онлайн-документацию, чтобы я лучше понял, что происходит под прикрытием?

1 Ответ

0 голосов
/ 02 ноября 2010
public ActionResult EditDetail(EditDetailItemModel model)

Эта строка будет выполнять привязку модели. Представьте, что параметры ActionMethod всегда заполняются вызовом UpdateModel.

Вы не видите значения refreshedModel в представлении, вы видите записи и значения ModelState из EditDetailItemModel.

...