Cómo redirigir aAction en ASP.NET MVC sin perder datos de solicitud

Usando ASP.NET MVC hay situaciones (como el envío de formularios) que pueden requerir un RedirectToAction .

Una de estas situaciones es cuando encuentra errores de validación después de enviar un formulario y necesita volver a dirigirlo al formulario, pero desea que el URL refleje el URL del formulario, no la página de acciones a la que envía.

Como requiero que el formulario contenga los datos POST ed originalmente, para la conveniencia del usuario, así como también para fines de validación, ¿cómo puedo pasar los datos a través de RedirectToAction() ? Si utilizo el parámetro viewData, mis parámetros POST se cambiarán a parámetros GET .

La solución es usar la propiedad TempData para almacenar los componentes de solicitud deseados.

Por ejemplo:

 public ActionResult Send() { TempData["form"] = Request.Form; return this.RedirectToAction(a => a.Form()); } 

Luego, en su acción de “Forma” puede ir:

 public ActionResult Form() { /* Declare viewData etc. */ if (TempData["form"] != null) { /* Cast TempData["form"] to System.Collections.Specialized.NameValueCollection and use it */ } return View("Form", viewData); } 

Tenga en cuenta que TempData almacena la colección de formularios en sesión. Si no le gusta ese comportamiento, puede implementar la nueva interfaz ITempDataProvider y usar algún otro mecanismo para almacenar datos temporales. No lo haría a menos que supiera con certeza (a través de la medición y el perfil) que el uso del estado de sesión lo está perjudicando.

Eche un vistazo a MVCContrib , puede hacer esto:

 using MvcContrib.Filters; [ModelStateToTempData] public class MyController : Controller { // ... } 

Hay otra forma de evitar tempdata. El patrón que me gusta incluye la creación de 1 acción tanto para el render original como para la renderización de la forma no válida. Es algo parecido a esto:

 var form = new FooForm(); if (request.UrlReferrer == request.Url) { // Fill form with previous request's data } if (Request.IsPost()) { if (!form.IsValid) { ViewData["ValidationErrors"] = ... } else { // update model model.something = foo.something; // handoff to post update action return RedirectToAction("ModelUpdated", ... etc); } } // By default render 1 view until form is a valid post ViewData["Form"] = form; return View(); 

Ese es el patrón más o menos. Un pequeño pseudoy. Con esto puede crear 1 vista para gestionar la representación del formulario, volver a visualizar los valores (ya que el formulario se rellenará con valores anteriores) y mostrar los mensajes de error.

Cuando la publicación de esta acción, si es válida, transfiere el control a otra acción.

Estoy tratando de simplificar este patrón en el marco de validación de .NET a medida que construimos el soporte para MVC.

Si desea pasar datos a la acción redirigida, el método que puede usar es:

 return RedirectToAction("ModelUpdated", new {id = 1}); // The definition of the action method like public ActionResult ModelUpdated(int id);