Cómo RedirectToAction en ASP.NET MVC sin perder los datos de la solicitud

StackOverflow https://stackoverflow.com/questions/1936

  •  08-06-2019
  •  | 
  •  

Pregunta

El uso de ASP.NET MVC hay situaciones (tales como el envío de formularios) que puede requerir de un RedirectToAction.

Una situación de este tipo es cuando se encuentra con errores de validación después de que el envío de un formulario y la necesidad de redirigir de nuevo a la forma, pero sería como la URL para reflejar la URL de la forma, no la acción de la página se somete a.

Como necesito el formulario para contener la originalmente POSTed de datos, para la comodidad de los usuarios, así como la validación de los efectos, ¿cómo puedo pasar los datos a través de la RedirectToAction()?Si yo uso el viewData parámetro, mi POST los parámetros serán cambiados GET los parámetros.

¿Fue útil?

Solución

La solución es utilizar el TempData propiedad para almacenar el deseado de Solicitud de componentes.

Por ejemplo:

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

A continuación, en su "Forma" de la acción 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);
}

Otros consejos

Tenga en cuenta que TempData almacena el formulario de recogida en la sesión.Si no te gusta ese comportamiento, puede implementar el nuevo ITempDataProvider interfaz y el uso de algún otro mecanismo para almacenar datos temporales.Yo no haría eso a menos que sepa que es un hecho (a través de la medición y de perfil) que el uso de estado de la Sesión está haciendo daño.

Echa un vistazo a MVCContrib, usted puede hacer esto:

using MvcContrib.Filters;

[ModelStateToTempData]
public class MyController : Controller {
    //
    ...
}

Hay otra forma que evita tempdata.El patrón me gusta implica la creación de 1 acción por tanto el render y volver a procesar el formulario no válido.Es algo como 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 poco de pseudoy.Con esto usted puede crear 1 vista a la manija de la representación de la forma, volver a la visualización de los valores (ya que el formulario será llenado con los valores anteriores), y muestra mensajes de error.

Cuando la publicación de esta acción, si su validez se transfiere el control a otra acción.

Estoy tratando de hacer este patrón fácil en el .net marco de validación a medida que construir apoyo para MVC.

Si quieres pasar los datos a la redirigido acción, el método que se podría utilizar es:

return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like  public ActionResult ModelUpdated(int id);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top