How do I maintain ModelState errors when using RedirectToAction?

后端 未结 5 1525
南笙
南笙 2020-12-01 03:42

I have some code that saves a ticket in our system. If there is an error it does a RedirectToAction. The problem is that I don\'t seem to have my errors in the new action.

5条回答
  •  渐次进展
    2020-12-01 04:36

    What I did to maintain my ModelState no matter where I go with redirects is the following:

    1. In your model, add:

      public ModelStateDictionary modelstate { get; set; }
      
    2. In your model's constructor, add:

      this.modelstate = new System.Web.Mvc.ModelStateDictionary();
      
    3. Sample Post with my model called 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. So now your tempdata has your model and modelstate as is.

    5. The following is my view that is agnostic to the state of anything, unless it has something. Here's the code:

      [HttpGet]
      public ActionResult contactinformation()
      {
          //try cast to model
          var m = new Models.ContactInformation();
          if (TempData["contact"] is Models.ContactInformation) m = (Models.ContactInformation)TempData["contact"];
      
          //restore 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);
      }
      

提交回复
热议问题