Reputation: 235
I have a drop down list that gets populated from
ViewModel:
public class OrgPages
{
public int ID { get; set; }
public string URL { get; set; }
}
Helper:
public SelectList PageList()
{
var pagelist = new List<OrgPages>();
foreach (var count in Enumerable.Range(1, 10))
{
var pages = new OrgPages();
pages.ID = count;
if(count == 1)
pages.URL = "Done";
else if (count == 2)
pages.URL = "Address";
else if (count == 3)
pages.URL = "Import/Export";
else if (count == 4)
pages.URL = "Membership";
else if (count == 5)
pages.URL = "Business Type";
else if (count == 6)
pages.URL = "Industry Type";
else if (count == 7)
pages.URL = "Phone Number";
else if (count == 8)
pages.URL = "Email";
else if (count == 9)
pages.URL = "Website";
else if (count == 10)
pages.URL = "Note";
pagelist.Add(pages);
}
return new SelectList(pagelist, "ID", "URL", 0);
}
In my controller I initiate my helper:
private DropDownPopulatorController ddp = new DropDownPopulatorController();
And in my create action, not the post, I call the ViewBag:
ViewBag.OrgPages = ddp.PageList();
In my HTTP POST create action I pass the OrgPages value:
[HttpPost]
public ActionResult Create(OrganizationEmail email, int OrgPages)
{
try
{
// TODO: Add insert logic here
using (var db = new VAGTCEntities())
{
db.OrganizationEmails.Add(email);
db.SaveChanges();
}
if (OrgPages == 2)
return RedirectToAction("Create", "OrgAddress");
else if (OrgPages == 3)
return RedirectToAction("Create", "OrgIE");
else if (OrgPages == 4)
return RedirectToAction("Create", "OrgMembership");
else if (OrgPages == 5)
return RedirectToAction("Create", "OrgBusinessType");
else if (OrgPages == 6)
return RedirectToAction("Create", "OrgIndustryType");
else if (OrgPages == 7)
return RedirectToAction("Create", "OrgPhone");
else if (OrgPages == 8)
return RedirectToAction("Create", "OrgEmail");
else if (OrgPages == 9)
return RedirectToAction("Create", "OrgWebsite");
else if (OrgPages == 10)
return RedirectToAction("Create", "OrgNote");
else
return RedirectToAction("Index");
}
catch (Exception)
{
ModelState.AddModelError("Error", "This item exists in the database already.");
}
return View(email);
}
And in my Create View page I put this inside the fieldset:
<div>
@Html.Label("Add:")
</div>
<div>
@Html.DropDownList("OrgPages")
</div>
So, now, when someone submits the form they can pick the next page they quickly want to get to. It works flawlessly when there is no errors submitting the form (like no duplicates). However, when there is a duplicate primary key, or similar error it spits out the error There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'OrgPages'.
Thank you for any help!
Edit * Create action
public ActionResult Create()
{
ViewBag.OrgPages = ddp.PageList();
return View();
}
Upvotes: 0
Views: 1696
Reputation: 235
After debugging it a couple times and following it through - I noticed it was getting caught on the return back to the create: return View(email);
It didn't have the ViewData for OrgPages anymore at that point. So, all I did was call ViewBag.OrgPages = ddp.PageList();
again in the catch block after it displays the error. That fixed it!
Upvotes: 1