Вот простая проблема: пользователи хотят редактировать продукты в виде сетки: выберите и нажмите кнопку добавления, выберите и нажмите кнопку добавления ... и они увидят обновленный список продуктов ... затем нажмите "Готово" и заказ должен быть сохранен .
Тем не менее, каждое «Добавить» имеет для перехода на сервер, поскольку оно включает проверку на стороне сервера. Более того, проверка выполняется внутри сущности домена (скажем, Order) - то есть, чтобы проверка прошла, мне нужно вызвать order.Add (product), а затем order решает, сможет ли он добавить продукт.
Проблема в том, что, если я добавлю продукты в заказ, он сохранит изменения, поэтому даже если пользователи не нажмут кнопку «Готово», изменения все равно останутся!
ОК, вероятно, не следует изменять порядок, пока пользователи не нажмут кнопку Готово. Тем не менее, как я могу проверить продукт тогда? Это должен сделать объект заказа - если продукт уже добавлен, если продукт не конфликтует с другими продуктами и т. Д.
Другая проблема заключается в том, что мне нужно добавить продукт в заказ и «перестроить представление / HTML» на основе его нового состояния (поскольку оно может сильно измениться). Но если я не сохраню изменения заказа, следующее добавление будет начинаться с одного и того же заказа каждый раз, а не с обновленного. То есть мне нужно как-то отслеживать изменения в заказе.
Я вижу несколько решений:
- Каждый раз, когда пользователь нажимает кнопку «Добавить», извлекает заказ из базы данных и добавляет все новые продукты (со страницы), но не сохраняет его, просто возвращает вид (заказ). Проблема в том, что я не могу перенаправить из POST / Edit в GET / Edit - потому что все данные существуют только в данных POST, и GET теряет их. Это означает, что страница «Обновить» работает неправильно (F5, и вы получаете дублированный запрос, не говоря уже о диалоговом окне браузера)).
- Хм, я думал, что может сделать перенаправление на GET, используя TempData (и помощник MvcContrib). Поэтому после POST to / Edit я обрабатываю бизнес-логику, получаю новые данные для просмотра и выполняю RedirectToAction <> (data) из MvcContrib, который передает данные через TempData. Но поскольку TempDate - это ... temp ... после F5 все данные теряются. Не работает Эти проклятые данные должны храниться где-то, так или иначе.
- Сохранение «редактировать объект» в сеансе с данными POST (заказ, информация о новых продуктах). Это также может быть база данных. Вид "текущий элемент - на тип страницы". Таким образом, страница получит идентификатор заказа и добавленные в данный момент товары из этого хранилища. Но редактирование с нескольких страниц проблематично. И я не люблю хранить временные / текущие объекты в сеансе.
- Пометка продуктов как «подтвержденных» - если мы делаем / заказываем / показываем, мы сначала убираем все неподтвержденные продукты из заказа. Уродливая и грязная логика.
- Сделайте копию заказа - временную - и сделайте / отредактируйте работу с ней. Подтверждение перенесет изменения из временного порядка в постоянный. Много уродливой работы.
- Может быть, немного магии AJAX? То есть Кнопка «Добавить» не перезагрузит страницу, а просто отправит новые + уже добавленные продукты на сервер, сервер будет подтвержден как заказ. Добавление (products + newproduct), но не будет сохранять изменения, просто вернет обновленный заказ информация для восстановления сетки. Но Refresh / F5 уничтожит всю введенную пользователем информацию.
- Что еще?
Это общая проблема? Как вы решаете подобные? Какие лучшие практики?