vista tutorial paso net mvc multiple modelo form filters controlador buttons asp c# asp.net-mvc

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.