cómo hacer un asistente con ASP.Net MVC

Nuestro sitio tiene varios “asistentes” en los que se recostackn diversos datos en varias páginas y no se pueden comprometer con la base de datos hasta el último paso.

¿Cuál es la mejor / forma correcta de hacer un asistente como este con ASP.Net MVC?

editar: Mi jefe ahora dice “no javascript”: ¿alguna idea sobre cómo evitar esa restricción?

No creo que exista la mejor / correcta forma, pero la forma en que lo haría es …

Cada asistente tiene su propia página. Cada paso obtiene su propio div. Todos los pasos están en la misma forma.

Los botones anterior / siguiente esencialmente ocultar / mostrar el div en cada paso del proceso. El botón de envío del último paso envía el formulario completo. Sería bastante trivial implementar esto usando jQuery, y sería fácil de mantener ya que todos los pasos del asistente se encuentran en una sola página de visualización.

En el lado del controlador, tendría dos métodos de control, la versión HttpVerbs.Get que prepararía el formulario para ver y la versión HttpVerbs.Post que tomaría un FormsResult y lo analizaría para obtener la información necesaria para enviar las respuestas del usuario al almacenamiento / otros procesos.


Wow, tu jefe apesta.

Esta respuesta casi con gracia funciona para aquellos ****** que tienen javascript deshabilitado (sí, ambos). Puede modificarlo para ocultar los botones anteriores a través de CSS y mostrarlos en su código de JavaScript. De esta forma, las personas con javascript verán el asistente y las personas sin javascript verán el formulario completo (sin los botones next / prev).

La otra opción es crear una vista para cada paso en el asistente. Puede almacenar los resultados intermedios del formulario en la Sesión. De esta manera, le costaría mucho tiempo y esfuerzo implementarlo, lo que significa que probablemente podría exprimir algunas horas extras de su jefe cuando demuestre, en aproximadamente veinte minutos de esfuerzo que gasta durante el almuerzo, cuán fácil es implementar la ruta de JavaScript.

Si no puede usar JavaScript, haga que cada paso sea una vista, con un método en el controlador, y mantenga sus datos en sesión hasta que esté listo para enviarlos a la base de datos.

Puede hacer que sus botones Siguiente y Anterior utilicen el método ActionLink HtmlHelper.

Otra forma es guardar el objeto incompleto que está creando con el asistente en la base de datos y simplemente pasar la clave principal al siguiente paso del asistente. Sé que esto significa que debe hacer que algunos de los campos de la base de datos sean anulables, pero tiene la ventaja añadida de que puede guardar la clave primaria en una cookie y permitir que el usuario regrese al asistente más adelante. Esta opción no requiere javascript o estado de sesión.

Haga que los diferentes paneles sean del lado del cliente … todos en la misma forma … y cuando se presiona el botón de envío final, puede publicar todos los valores al mismo tiempo.

Si no puede usar Javascript y no quiere gastar recursos del servidor con variables de Sesión, también puede serializar y deserializar los valores que se ingresan en los diferentes pasos, y pasarlos de un lado a otro usando un campo de entrada oculto. Un poco como ViewState en ASP.NET Webforms.

Junté un asistente de inicio de sesión y documenté las ideas detrás de él en mi blog si eso ayuda: enlace de texto

Puede usar el componente simple MVCWizard.Wizard disponible en NuGet. WizardController le permite crear un asistente utilizando vista parcial. También está el AutoWizardController que representa todo el asistente en una sola vista. Todos estos componentes operan con la sesión para almacenar el estado del modelo.

Hay un método muy simple, flexible y extensible en esta pregunta: Cómo simplificar mis diálogos modales entrelazados statefull en ASP.NET MVC