Cómo redireccionar a la acción en ASP.NET MVC sin perder datos de solicitud


Utilizando 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 un envío de formulario y necesita redirigir de nuevo al formulario, pero desea que la URL refleje la URL del formulario, no la página de acción a la que envía.

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

Author: SpaceDog, 2008-08-05

5 answers

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 "Formulario" 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);
}
 76
Author: Matt Mitchell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-07 00:59: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. Yo no haría eso a menos que sepas a ciencia cierta (a través de la medición y la elaboración de perfiles) que el uso del estado de sesión te está perjudicando.

 36
Author: Haacked,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-07 05:12:32

Echa un vistazo a MvcContrib , puedes hacer esto:

using MvcContrib.Filters;

[ModelStateToTempData]
public class MyController : Controller {
    //
    ...
}
 13
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-22 16:48:19

Hay otra manera que evita tempdata. El patrón que me gusta implica crear 1 acción tanto para el renderizado original como para el re-renderizado de la forma inválida. Dice 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 pequeño pseudoy. Con esto puede crear 1 vista para manejar la representación del formulario, volver a mostrar los valores (ya que el formulario se llenará con valores anteriores) y mostrar mensajes de error.

Cuando el envío a esta acción, si es válido transfiere control sobre otra acción.

Estoy tratando de hacer este patrón fácil en el . net validation framework mientras construimos soporte para MVC.

 8
Author: Dane O'Connor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-26 19:27:04

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

return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like  public ActionResult ModelUpdated(int id);
 2
Author: lzlstyle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-30 08:39:03