como fazer um assistente com ASP.Net MVC

Nosso site tem vários “assistentes”, nos quais vários dados são coletados em várias páginas e não podem ser confirmados no database até a última etapa.

Qual é a melhor / correta maneira de fazer um assistente como este com asp.net MVC

edit: Meu chefe agora está dizendo “não javascript” – algum pensamento sobre como contornar essa restrição?

Eu não acredito que haja uma maneira melhor / correta, mas o jeito que eu faço é …

Cada assistente recebe sua própria página. Cada passo recebe seu próprio div. Todas as etapas estão no mesmo formulário.

Os botões anterior / próximo basicamente ocultariam / mostrariam o div em cada etapa do processo. O botão de envio da última etapa envia o formulário inteiro. Seria bastante trivial implementar isso usando jQuery, e seria fácil de manter, já que todas as etapas do assistente estão em um único ViewPage.

No lado do controlador, você teria dois methods de controlador, a versão HttpVerbs.Get que prepararia o formulário para exibição e a versão HttpVerbs.Post que usaria um FormsResult e o analisaria para obter as informações necessárias para enviar as respostas do usuário. para armazenamento / outros processos.


Uau, seu chefe fede.

Esta resposta quase graciosamente funciona para aqueles ****** que têm javascript desativado (sim, os dois). Você pode ajustá-lo para ocultar os próximos botões anteriores via CSS e exibi-los em seu código javascript. Desta forma, as pessoas com javascript ver o assistente e pessoas sem javascript vão ver o formulário inteiro (sem os botões next / prev).

A outra opção é criar uma exibição para cada etapa no assistente. Você pode armazenar os resultados intermediários do formulário na session. Desta forma, custaria muito tempo e esforço para implementar, o que significa que você provavelmente poderia extrair algumas horas extras do seu chefe quando você demonstrar, em cerca de vinte minutos de esforço que você gasta durante o almoço, como é fácil implementar a rota do javascript.

Se você não puder usar JavaScript, torne cada etapa uma exibição, com um método no controlador, e mantenha seus dados em session até que estejam prontos para enviar ao database.

Você pode fazer seus botões Next e Prev usando o método ActionLink HtmlHelper.

Outra maneira é salvar o object incompleto que você está construindo com o assistente no database e apenas passar a chave primária para a próxima etapa do assistente. Eu sei que isso significa que você precisa tornar alguns dos campos do database anuláveis, mas tem a vantagem adicional de poder salvar a chave primária em um cookie e permitir que o usuário retorne ao assistente em algum momento posterior. Esta opção não requer javascript ou estado de session.

Faça com que os diferentes painéis sejam do lado do cliente … todos da mesma forma … e quando o botão de envio final for pressionado, você poderá postar todos os valores ao mesmo tempo.

Se você não puder usar o Javascript e não quiser gastar resources do servidor com variables ​​de session, também poderá serializar e desserializar os valores inseridos nas etapas diferentes e passá-lo para frente e para trás usando um campo de input oculto. Um pouco como o ViewState em ASP.NET Webforms.

Eu montei um assistente de login e documentei as idéias por trás dele no meu blog, se isso ajuda: link text

Você pode usar o componente simples MVCWizard.Wizard disponível no NuGet. O WizardController permite que você crie um assistente usando a visão parcial. Há também o AutoWizardController que processa o assistente inteiro em uma única exibição. Todos esses componentes operam com a session para armazenar o estado do modelo.

Existe um método muito simples, flexível e extensível nesta questão: Como simplificar meus diálogos modais entrelaçados stateful no ASP.NET MVC