2008-11-17 1 views
46

Наш сайт имеет несколько «мастеров», где различные данные собираются на нескольких страницах и не могут быть привязаны к базе данных до последнего шага.Как сделать мастера с ASP.Net MVC

Что такое лучший/правильный способ сделать мастер, как это с ASP.Net MVC

редактировать: Мой босс теперь говорит «нет» JavaScript - любые мысли о том, как обойти это ограничение?

+2

Почему «нет JavaScript»? Вместо этого я использовал бы Flash или Silverlight :) – 2008-11-24 22:16:04

+2

Надеюсь, ваш босс уже не ваш босс ... из-за того, что он сказал ...;) – 2013-12-17 17:45:57

ответ

44

Я не считаю, что это лучший/правильный путь, но так, как я бы сделал это ...

Каждый мастер получает свою собственную страницу. Каждый шаг получает свой собственный div. Все шаги в той же форме.

Предыдущие/следующие кнопки по существу скроют/покажут div на каждом этапе процесса. Кнопка отправки последнего шага представляет всю форму. Было бы довольно тривиально реализовать это с помощью jQuery, и его было бы легко поддерживать, поскольку все шаги мастера находятся в одной ViewPage.

На стороне контроллера у вас есть два метода контроллера: версия HttpVerbs.Get, которая подготовит форму для просмотра и версию HttpVerbs.Post, которая примет форму FormsResult и проанализирует ее, чтобы получить информацию, необходимую для отправьте ответы пользователя на хранение/другие процессы.


Ничего себе, ваш босс воняет.

Этот ответ почти изящно работает для тех ******, у которых отключен javascript (да, оба они). Вы можете настроить его, чтобы скрыть следующие предыдущие кнопки с помощью CSS и показать их в своем javascript-коде. Таким образом, люди с javascript видят мастера, а люди без javascript будут видеть всю форму (без кнопок next/prev).

Другой вариант - создать представление для каждого шага мастера. Вы можете сохранить промежуточные результаты формы в сеансе. Этот способ будет стоить много времени и усилий для реализации, а это означает, что вы, вероятно, могли бы сжать некоторые сверхурочные из своего босса, когда вы продемонстрируете примерно через двадцать минут усилий, которые вы проводите во время обеда, насколько легко реализовать javascript-маршрут.

+10

Просто чтобы добавить что-то еще ,,, вы можете поместить каждый шаг мастера в частичном представлении и сделать Render.Partial на каждом DIV. – hminaya 2009-11-10 19:42:05

+7

Существует проблема с использованием единого представления и javascript, чтобы скрыть/показать, как вы упоминаете, - ваша страница станет абсолютно огромной, поскольку мастер растет. Конечно, мастер с 2-3 шагами может быть в порядке, но более того, и вы просто просите о неприятностях. – 2010-03-09 21:19:30

+3

@charles Какое число хуже, чем преждевременно оптимизировать? – Will 2010-03-10 11:19:17

4

Сделать все панели на стороне клиента ... все в том же виде ... и когда нажата последняя кнопка отправки, вы можете публиковать все значения одновременно.

20

Если вы не можете использовать JavaScript, то сделайте каждый шаг просмотра с помощью метода в контроллере и сохраните свои данные в сеансе до готовности для отправки в базу данных.

Вы можете сделать свои кнопки Next и Prev с помощью метода ActionLink HtmlHelper.

3

Если вы не можете использовать Javascript и не хотите тратить ресурсы сервера на переменные сеанса, вы также можете сериализовать и десериализовать значения, вводимые на разных этапах, и передавать их обратно и вперед, используя скрытое поле ввода , Немного похоже на ViewState в ASP.NET Webforms.

12

Другой способ - сохранить неполный объект, который вы строите с помощью мастера, в базу данных и просто передать первичный ключ на следующий шаг мастера. Я знаю, что это означает, что вам нужно сделать некоторые поля базы данных нулевыми, но у них есть дополнительное преимущество в том, что вы можете сохранить первичный ключ в cookie и позволить пользователю вернуться к мастеру через некоторое время. Этот параметр не требует состояния javascript или сеанса.

2

Я собрал мастер логин и документированы идеи позади него на моем блоге, если это помогает: link text

1

Вы можете использовать простой MVCWizard.Wizard компонента доступен на NuGet. WizardController позволяет вам создать мастер с частичным представлением. Существует также AutoWizardController, который отображает весь мастер в одном представлении. Все эти компоненты работают с сеансом для хранения состояния модели.

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