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
.
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);
}
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.
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 {
//
...
}
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.
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);
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