Pregunta

Estoy representando un formulario de inicio de sesión común utilizando Html.RenderAction, en cada página de mi sitio.

Si el usuario ingresa sus detalles en el cuadro de texto y hace clic en "Enviar", realiza una POST a un controlador que maneja el inicio de sesión.

Si cometen un error, como ingresar una dirección de correo electrónico no válida, rellenará el ModelState con un mensaje de error y luego lo redireccionará a la página en la que se encontraba anteriormente.

El problema es que, debido a que RenderAction se produce como una solicitud separada, estoy perdiendo el ViewModel.

Incluso cuando lo puse en TempData, se pierde, ya que TempData se vacía en cada solicitud por separado.

¿Hay alguna forma de preservar los datos entre llamadas Html.RenderAction consecutivas?

Si no, ¿alguna sugerencia sobre cómo podría hackear esto? (¿Debería poner los datos en sesión?)

¿Fue útil?

Solución

Esto es lo que he hecho por el momento. (Probablemente esta no sea la solución más ideal).

Creé un 'PreserveViewDataAttribute', que puse en cualquier acción para la cual quiero conservar el ViewData en la sesión.

En mi BaseController, anulé el método 'Redirigir' con mi propio método, que hace lo siguiente.

  1. Obtiene una referencia al método Action que lo llamó (un poco de reflexión aquí)

  2. Comprueba si este método tiene el 'PreserveViewDataAttribute' definido en él

  3. Si lo hace, copia el ViewData actual a una variable de sesión. (La etiqueta de la variable es la misma que el nombre de la acción actual, con '_ViewData' pegado al final.)

  4. En cualquier caso, llama al método de redireccionamiento básico.

Luego creé una propiedad en el BaseController llamada 'PreservedViewData', que devuelve ViewData en sesión, relevante para la acción actual. (O devuelve nulo si no se encuentra).

Por lo tanto, para conservar ViewData todo el tiempo que quiera, solo necesito decorar mi acción con 'PreserveViewDataAttribute', y luego llamar a 'PreservedViewData' cuando lo necesite.

Avísame si quieres el código fuente para esto.

Otros consejos

Es posible que te guste el enfoque de esta sección Post-Redirect-Get de Kazi Rashid.

http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx#prg

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top