我正在学习MVC4 + EF 5.0项目,我使用VS2012默认模板创建空白项目并将数据库搭建到* .edmx模型,以及用于编辑员工工作的编辑视图在哪家公司。
我遇到的问题是当用户输入失败并返回时,在编辑视图(Dropdown)中维护SelectList。
DropDownList绑定来自控制器的ListItem:
Edit.cshtml
@Html.DropDownListFor(model => model.CompanyID, (SelectList)ViewData["CompanySelectList"])
MemberController.cs
[HttpGet]
public ActionResult Edit(int SelectedCompanyID = 0, int StaffID = 0)
{
IQueryable<company_benefit> companys = from c in db.company where c.ID.Equals(CompanyID) select c ;
ViewData["CompanySelectList"] = new SelectList(companys, "ID", "Name", SelectedCompanyID);
staff s = db.staff.Find(StaffID);
if (s == null)
{
return HttpNotFound();
}
return View(s);
}
[HttpPost]
public ActionResult Edit(staff s)
{
if (ModelState.IsValid)
{
db.Entry(s).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index"); //Edit Success
}
return View(s); //Edit Fail
}
如果某人提交的表单中包含无效数据导致失败输入,则会返回该视图。 但是,SelectList是从ViewData绑定的,所以ViewData会在加载页面时消失,而且它是viewdata的行为,而且我更改为TempData也没有帮助。
所以我需要在Post to Edit Action时再次构建SelectList吗?
我关注使用session来存储它,但是无法打破MVC设计模式。
我的英语不好,抱歉混乱。 谢谢。
答案 0 :(得分:1)
快速解决方案是在您的http post方法中再次编辑创建视图数据
[HttpPost]
public ActionResult Edit(staff s)
{
if (ModelState.IsValid)
{
db.Entry(s).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index"); //Edit Success
}
IQueryable<company_benefit> companys = from c in db.company where c.ID.Equals(CompanyID) select c ;
ViewData["CompanySelectList"] = new SelectList(companys, "ID", "Name", SelectedCompanyID);
return View(s); //Edit Fail
}
您所做的基本上是说当您从编辑视图返回到服务器时,服务器应重建视图数据并调用相同的视图,以便填充列表。
有一种更好的方法可以创建包含当前模型和list<companys> companies = new list<companys>();
的模型,然后再从数据库中填充它。同样,这个概念只是使用强类型模型。