Модели MVC не успешно обновлены, но не могут найти причину

Это привело меня в бешенство.

Я получаю следующее исключение

System.InvalidOperationException: модель типа "Models.Expense" не была успешно обновлена.  в System.Web.Mvc.Controller.UpdateModel [TModel] (модель TModel, префикс String, String [] includeProperties, String [] excludeProperties, IDictionary`2 valueProvider)  в System.Web.Mvc.Controller.UpdateModel [TModel] (модель TModel)  atMVC.Controllers.BaseExpenseController.Edit(String id, CollectionCollection collection) в C:\Projects\Expenses.MVC\Controllers\BaseExpenseController.cs: строка 109

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

Любые указатели?

Ответ 1

Вместо этого выведите исключение или вызовите TryUpdateModel. TryUpdateModel не будет генерировать исключение, если он не может обновить вашу модель, он просто вернет false. Вы найдете сведения об ошибках в ModelState, как было предложено Крейгом. Фактически UpdateModel просто вызывает TryUpdateModel и бросает, если он возвращает false.

Ответ 2

Изучите контроллер .ModelState и найдите записи с ошибками > 0.

Ответ 3

Трудно сказать, не видя никакого кода, но каждый раз, когда я видел исключение этого типа, 99% времени было связано с базой данных. Не сказать, что основная причина не где-то в коде, но вполне возможно, что вы что-то упустили и пытаетесь передать недопустимые данные в базу данных. Другие проблемы, которые нужно искать, - это любая обработка отношений, которая должна иметь место.

Ответ 4

У меня была такая же проблема, и проблема была в том, что я использую интерфейс IValidatableObject в модели, которая была связана с той, которую я обновил. Реальная проблема была в базе данных, так как валидация дает, что я дублировал записи для уникального столбца:)

Дело в том. Вы должны использовать UpdateModel или TryUpdateModel, оба метода обновляют ModelState.IsValid. Теперь иногда бывает трудно найти причину ошибки. Посмотрите на отладчик для ModelState.ErrorKeys и проверьте, есть ли запись, которой не должно быть:)

Приветствия

Ответ 5

Обычно я проверяю 3 вещи.

  • Сделайте каждый из участников модели есть геттеры и сеттеры.
  • Выполняю требования модель. т.е.: все данные присутствуют и правильны?
  • Я что-то нарушаю? Нужно ли иметь значения по умолчанию для вложенных объектов?

Если это все еще не удается, я вернусь к;

class MyClass(FormCollection collection)
{
  string a = collection["MyField"];

который обычно работает.

Ответ 6

В сгенерированной веб-форме проверьте, есть ли у вас скрытое поле, возможно, идентификатор какого-либо типа, который не может быть обновлен.