ASP.NET MVC,正确的方法来持久化动态selectList?

时间:2013-03-28 01:54:15

标签: asp.net-mvc-4

我正在学习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设计模式。

我的英语不好,抱歉混乱。 谢谢。

1 个答案:

答案 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>();的模型,然后再从数据库中填充它。同样,这个概念只是使用强类型模型。