¿Cómo mantengo los errores de ModelState cuando uso RedirectToAction?

Tengo un código que guarda un ticket en nuestro sistema. Si hay un error, hace un RedirectToAction. El problema es que no parece tener mis errores en la nueva acción. ¿Cómo puedo arreglar esto?

ModelState.AddModelError("_FORM", "Unable to save ticket"); ModelState.AddModelError("_FORM", "Phone number was invalid."); ModelState.AddModelError("_FORM", "Lane number is required."); return RedirectToAction("CreateStep", "Ticket"); 

Sé que algunos han sugerido usar TempData, pero ¿cómo puedo obtener cada error del ModelState?

Gracias.

El patrón PRG está bien, pero hice esto:

Controlador base:

 protected override void OnActionExecuted(ActionExecutedContext filterContext) { if (TempData["ModelState"] != null && !ModelState.Equals(TempData["ModelState"])) ModelState.Merge((ModelStateDictionary)TempData["ModelState"]); base.OnActionExecuted(filterContext); } 

Acción (estoy usando xVal ):

 try { user.Login(); AuthenticationManager.SignIn(user); } catch (RulesException rex) { // on bad login rex.AddModelStateErrors(ModelState, "user"); TempData["ModelState"] = ModelState; return Redirect(Request.UrlReferrer.ToString()); } 

La acción arroja una excepción, agrega ModelState a TempData y redirige a la referencia. Como la acción está capturada, OnActionExecuted se sigue ejecutando, pero la primera vez que se usa el ModelState es la misma que TempData [“ModelState”], por lo que no desea fusionarse consigo mismo. Cuando se ejecuta la acción de redireccionamiento, OnActionExecuted vuelve a activarse. Esta vez, si hay algo en TempData [“ModelState”], se fusiona con el ModelState de esta acción.

Puede expandirlo a varios modelos usando TempData [“ModelState.user”] = ModelState y luego fusionando cada objeto TempData que comienza con ModelState.

Sé que este hilo es antiguo, pero este blog sobre las mejores prácticas de ASP.NET tiene algunas sugerencias excelentes.
# 13 en la página trata sobre el uso de 2 filtros de acción para guardar y restaurar ModelState entre los redireccionamientos.

Este es el patrón que usa mi trabajo, y me encanta.

Aquí está el ejemplo simplificado:

 [ImportModelStateFromTempData] public ActionResult Dashboard() { return View(); } [AcceptVerbs(HttpVerbs.Post), ExportModelStateToTempData] public ActionResult Dashboard(string data) { if (ValidateData(data)) { try { _service.Submit(data); } catch (Exception e) { ModelState.AddModelError(ModelStateException, e); } } return RedirectToAction("Dashboard"); } 

esta publicación de blog describe cómo se puede implementar el patrón PRG en MVC http://blog.simonlovely.com/archive/2008/11/26/post-redirect-get-pattern-in-mvc.aspx

hth

Use la colección TempData []

La temperatura se almacena de una solicitud a la siguiente, luego se ha ido.

Lo que hice para mantener mi ModelState sin importar a dónde vaya con los redireccionamientos es el siguiente:

  1. En su modelo, agregue:

     public ModelStateDictionary modelstate { get; set; } 
  2. En el constructor de tu modelo, agrega:

     this.modelstate = new System.Web.Mvc.ModelStateDictionary(); 
  3. Publicación de muestra con mi modelo llamado Models.ContactInformation:

     [HttpPost] [ValidateAntiForgeryToken] public ActionResult contact(Models.ContactInformation con) { if (string.IsNullOrEmpty(con.SelectedAgencySelectorType)) { ModelState.AddModelError("", "You did not select an agency type."); } con.modelstate = ModelState; TempData["contact"] = con; if (!ModelState.IsValid) return RedirectToAction("contactinformation", "reports"); //do stuff return RedirectToAction("contactinformation", "reports"); } 
  4. Entonces ahora sus tempdatos tienen su modelo y estado modelo tal como están.

  5. El siguiente es mi punto de vista que es agnóstico al estado de cualquier cosa, a menos que tenga algo. Aquí está el código:

     [HttpGet] public ActionResult contactinformation() { //try cast to model var m = new Models.ContactInformation(); if (TempData["contact"] is Models.ContactInformation) m = (Models.ContactInformation)TempData["contact"]; //restre modelstate if needed if (!m.modelstate.IsValid) { foreach (ModelState item in m.modelstate.Values) { foreach (ModelError err in item.Errors) { ModelState.AddModelError("", err.ErrorMessage.ToString()); } } } return View(m); } 

Creo que pierdes el estado de tu modelo cuando realizas una redirección. Tal vez podrías reescribir tu lógica a algo como:

 public ActionResult Save() { // your code... if(saveSucceeded) { return View("Saved"); } else { return View("Create"); } } 

Y la forma habitual de recibir su mensaje de error:

 <%= Html.ValidationMessage("property_name") %>