c# - tutorial - mvc multiple submit buttons
Cómo redirigir a acción en ASP.NET MVC sin perder los datos de la solicitud (5)
Usando ASP.NET MVC hay situaciones (como el envío de formularios) que pueden requerir un RedirectToAction
.
Una de esas situaciones es cuando encuentra errores de validación después de enviar un 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 se envía.
Como necesito que el formulario contenga los datos POST
originalmente, para comodidad del usuario, así como para fines de validación, ¿cómo puedo pasar los datos a través de RedirectToAction()
? Si uso el parámetro viewData, mis parámetros POST
cambiarán a parámetros GET
.
Echa un vistazo a MVCContrib , puedes hacer esto:
using MvcContrib.Filters;
[ModelStateToTempData]
public class MyController : Controller {
//
...
}
Hay otra forma de evitar tempdata. El patrón que me gusta implica crear 1 acción tanto para el renderizado original como para el renderizado inválido. 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 manejar la representación del formulario, volver a mostrar los valores (ya que el formulario se completará con valores anteriores) y mostrar mensajes de error.
Cuando se publica en esta acción, si es válida, transfiere el control a otra acción.
Estoy tratando de facilitar este patrón en el marco de validación .net a medida que desarrollamos soporte para MVC.
La solución es utilizar 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);
}
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);
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 haría eso a menos que sepa de hecho (a través de la medición y el perfil) que el uso del estado de sesión lo está perjudicando.