2016-09-20 1 views
0

Мы используем хорошо известный шаблон Post-Redirect-Get, чтобы предотвратить двойную публикацию в нашем приложении MVC. Как и в большинстве реализаций, мы сохраняем состояние модели внутри TempData в Http-Post-Action по ошибкам и восстанавливаем состояние модели с ModelState.Merge() внутри действия, к которому мы перенаправлены. Это очень хорошо работает в большинстве случаев, но ломается в следующем случае, когда мы добавляем новые элементы в вложенную View-Model.Новые записи в вложенных ViewModel не воссозданы на ModelState.Merge()

  1. Редактор шаблона на странице обновлен и содержит дополнительный вложенный элемент модели представления.
  2. В другом поле с окружающим видом, которое содержит шаблон редактора, другое поле является недопустимым и предотвращает фиксацию в db и заставляет PRG входить в путь ошибки (перенаправить на GET).
  3. Когда страница отправляется, модельное состояние содержит новый вложенный элемент Property[n+1].Value и его значение и сохраняется в TempData. После Merge() модельное состояние в filterContext перенаправленного на Get-Method содержит дополнительный элемент.

Теперь, когда представление получает визуализацию, новый элемент не воссоздается, поскольку он находится только в состоянии модели, но не в модели. Просмотр циклов создания над моделью (у которой нет нового вложенного объекта), а EditorFor<> получает значение из состояния модели, которое, как и ожидалось. Существует ли общее решение этой проблемы?

ответ

0

По-видимому, быстрого решения проблемы не существует. Мы перешли от перенаправления на пути ошибки в контроллере (строгая PRG) к реализации, описанной в этом blog. Он работает очень хорошо и даже ускоряет работу приложения, поскольку возвращаемый json на пути ошибок контроллеров обрабатывается намного быстрее, чем полный ViewResult.

 Смежные вопросы

  • Нет связанных вопросов^_^