c# - vista - mvc submit button action




Cómo redirigir a acción en ASP.NET MVC sin perder los datos de la solicitud (4)

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.


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.





asp.net-mvc