ASP.NET MVC: где сохранить сущность, редактируемую пользователем - PullRequest
1 голос
/ 23 октября 2009

Вот простая проблема: пользователи хотят редактировать продукты в виде сетки: выберите и нажмите кнопку добавления, выберите и нажмите кнопку добавления ... и они увидят обновленный список продуктов ... затем нажмите "Готово" и заказ должен быть сохранен .

Тем не менее, каждое «Добавить» имеет для перехода на сервер, поскольку оно включает проверку на стороне сервера. Более того, проверка выполняется внутри сущности домена (скажем, Order) - то есть, чтобы проверка прошла, мне нужно вызвать order.Add (product), а затем order решает, сможет ли он добавить продукт.

Проблема в том, что, если я добавлю продукты в заказ, он сохранит изменения, поэтому даже если пользователи не нажмут кнопку «Готово», изменения все равно останутся!

ОК, вероятно, не следует изменять порядок, пока пользователи не нажмут кнопку Готово. Тем не менее, как я могу проверить продукт тогда? Это должен сделать объект заказа - если продукт уже добавлен, если продукт не конфликтует с другими продуктами и т. Д.

Другая проблема заключается в том, что мне нужно добавить продукт в заказ и «перестроить представление / HTML» на основе его нового состояния (поскольку оно может сильно измениться). Но если я не сохраню изменения заказа, следующее добавление будет начинаться с одного и того же заказа каждый раз, а не с обновленного. То есть мне нужно как-то отслеживать изменения в заказе.

Я вижу несколько решений:

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

Это общая проблема? Как вы решаете подобные? Какие лучшие практики?

Ответы [ 2 ]

0 голосов
/ 24 октября 2009

На вашем месте я бы придумал что-то похожее на вариант 5. А поскольку вы говорите, что вам нравится Ajax, вы можете попробовать это. Но прежде чем сделать это, вы должны переместить логику проверки за пределы метода Order.Add (). Может быть, вы можете переместить его в другую публичную функцию под названием Validate (), которая возвращает bool. И вы все равно можете вызывать тот же Validate () в методе Add (), тем самым выполняя необходимую проверку перед добавлением заказа.

  1. Попробуйте выполнить проверку на стороне клиента. Если вы используете jQuery, вы можете использовать плагин проверки jquery. Но, если это невозможно по какой-то причине (например, когда вам нужно проверить вещи по базе данных). Вы должны выполнить проверку на стороне сервера и просто вернуть объект JSON с логическим флагом 'success' и необязательным сообщением, просто чтобы отметить, что данные действительны. Вы позволите пользователю добавлять новый продукт, только если предыдущий Заказ действителен.
  2. И когда пользователь нажимает «Завершить», отправьте продукт на сервер и повторите проверку, но сохраните порядок в этом цикле.

Теперь, если бы у меня было полное право голоса, я бы даже не пошел на проверку, когда продукт добавлен / отредактирован. Я бы просто делал валидацию всякий раз, когда клиент заканчивал. Это было бы самым простым решением. Но, может быть, я что-то упускаю.

0 голосов
/ 23 октября 2009

Это во многом зависит от того, как вы реализуете свои объекты / проверку, но ваш вариант № 5, вероятно, лучшая идея. Если AJAX вам не подходит, вы можете сделать то же самое, записав соответствующие данные уже добавленных, но не сохраненных записей в скрытые поля.

Другими словами, поток заканчивается примерно так:

  1. Пользователь вводит элемент.

  2. Элемент отправлен на сервер и проверен. Представление возвращается с данными, введенными пользователем в скрытых полях.

  3. Пользователь вводит второй элемент.

  4. Элемент отправляется на сервер, и оба элемента проверяются. Представление возвращается с данными для обоих элементов в скрытых полях.

  5. и т.д..

Пока F5 / Refresh убивает введенные данные ... По моему опыту, это не слишком большая проблема. Более насущной проблемой являются кнопки «назад» / «вперед», которыми нужно управлять с помощью чего-то вроде «Действительно простой истории».

Если вы хотите, чтобы страница продолжала работать после обновления, вам нужно выполнить одно из следующих действий:

  1. Сохранять записи в базе данных, так или иначе связанной с текущим пользователем.
  2. Сохранять записи в сессии.
  3. Сохранить записи в строке запроса.

Это единственные доступные хранилища, которые сохраняются как при перенаправлении, так и при обновлении.

...