Мы используем хорошо известный шаблон Post-Redirect-Get, чтобы предотвратить двойную публикацию в нашем приложении MVC. Как и в большинстве реализаций, мы сохраняем состояние модели внутри TempData
в Http-Post-Action по ошибкам и восстанавливаем состояние модели с ModelState.Merge()
внутри действия, к которому мы перенаправлены. Это очень хорошо работает в большинстве случаев, но ломается в следующем случае, когда мы добавляем новые элементы в вложенную View-Model.Новые записи в вложенных ViewModel не воссозданы на ModelState.Merge()
- Редактор шаблона на странице обновлен и содержит дополнительный вложенный элемент модели представления.
- В другом поле с окружающим видом, которое содержит шаблон редактора, другое поле является недопустимым и предотвращает фиксацию в db и заставляет PRG входить в путь ошибки (перенаправить на GET).
- Когда страница отправляется, модельное состояние содержит новый вложенный элемент
Property[n+1].Value
и его значение и сохраняется вTempData
. ПослеMerge()
модельное состояние вfilterContext
перенаправленного на Get-Method содержит дополнительный элемент.
Теперь, когда представление получает визуализацию, новый элемент не воссоздается, поскольку он находится только в состоянии модели, но не в модели. Просмотр циклов создания над моделью (у которой нет нового вложенного объекта), а EditorFor<>
получает значение из состояния модели, которое, как и ожидалось. Существует ли общее решение этой проблемы?