Aquí podría ser tu PUBLICIDAD


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 Matt Mitchell
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 Matt Mitchell


Aquí podría ser tu PUBLICIDAD


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 Haacked

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 Dan

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 11:06
fuente por usuario Dane O'Connor

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 lzlstyle