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

votos
115

Usando ASP.NET MVC hay situaciones (como el envío de formularios) que pueden requerir a 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 POSTdatos originalmente editados, para mayor comodidad del usuario, así como también con fines de validación, ¿cómo puedo pasar los datos a través de RedirectToAction()? Si uso el parámetro viewData, mis POSTparámetros se cambiarán a GETparámetros.

Publicado el 05/08/2008 a las 06:33
fuente por usuario
En otros idiomas...                            


5 respuestas

votos
76

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);
}
Respondida el 05/08/2008 a las 06:43
fuente por usuario

votos
36

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.

Respondida el 07/08/2008 a las 06:12
fuente por usuario

votos
13

Eche un vistazo a MVCContrib , puede hacer esto:

using MvcContrib.Filters;

[ModelStateToTempData]
public class MyController : Controller {
    //
    ...
}
Respondida el 05/04/2009 a las 10:36
fuente por usuario

votos
8

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.

Respondida el 25/08/2008 a las 23:06
fuente por usuario

votos
2

Si desea pasar los datos a la acción reorientada, el método se puede utilizar es:

return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like  public ActionResult ModelUpdated(int id);
Respondida el 30/11/2013 a las 09:39
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more