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