как сделать мастера с ASP.Net MVC - PullRequest
47 голосов
/ 18 ноября 2008

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

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

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

Ответы [ 8 ]

45 голосов
/ 18 ноября 2008

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

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

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

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


Ух ты, твой босс воняет.

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

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

20 голосов
/ 18 ноября 2008

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

Вы можете создавать кнопки Next и Prev, используя метод ActionLink HtmlHelper.

12 голосов
/ 03 февраля 2009

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

4 голосов
/ 18 ноября 2008

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

3 голосов
/ 25 ноября 2008

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

2 голосов
/ 23 сентября 2009

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

1 голос
/ 19 декабря 2011

В этом вопросе есть очень простой, гибкий и расширяемый метод: Как упростить мои переплетающиеся модальные диалоговые окна в ASP.NET MVC

1 голос
/ 12 сентября 2011

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

...