Estoy usando el patrón Redirect After Post en mi aplicación ASP.NET MVC. Tengo el siguiente escenario:Redirigir después de publicar en ASP.NET MVC
- usuario va a
/controller/index
donde se le pide que rellene un formulario. - Los valores de formulario se envían a
/controller/calculate
. - La acción
Calculate
realiza un cálculo basado en la entrada y crea una instancia de un objeto complejo que contiene los resultados de la operación. Este objeto se almacena enTempData
y el usuario se redirige al/controller/result
. /controller/result
recupera el resultado deTempData
y se lo presenta al usuario.
El problema con este enfoque es que si el usuario pulsa F5 mientras observa los resultados en /controller/result
la página ya no se puede representar como TempData
ha expirado y el objeto de resultado ya no está disponible.
Este comportamiento no es deseado por los usuarios. Una posible solución sería en lugar de redirigir después del POST, simplemente renderizando la vista de resultados. Ahora, si el usuario pulsa F5, obtiene un diálogo del navegador que le pregunta si desea volver a publicar el formulario. Esto tampoco fue deseado.
Una solución posible que pensé fue serializar el objeto resultante y pasarlo en la URL antes de redirigir pero AFAIK hay algunas limitaciones en la longitud de una solicitud GET y si el objeto se pone bastante grande podría llegar a esta limitación (especialmente si está codificado en base64).
Otra posibilidad sería utilizar el objeto Session
en lugar de TempData
para persistir en los resultados. Pero antes de implementar esta solución, me gustaría saber si hay una mejor manera de hacerlo.
ACTUALIZACIÓN:
Además de investigar el tema descubrí que si vuelvo a poner el objeto de resultado en TempData
dentro de la acción /controller/result
que realmente funciona:
public ActionResult Result()
{
var result = TempData["result"];
TempData["result"] = result;
return View(result);
}
Pero esto se siente especie de sucio. ¿Podría haber algún efecto secundario con este enfoque (como cambiar a proveedores de sesiones fuera del proceso ya que actualmente uso InProc)?
Cuando dice "redirigir" está llamando RedirectToAction? – Will
Sí, RedirectToAction. –