0

我正在学习 MVC4+EF 5.0 项目,我使用 VS2012 默认模板创建空白项目并将数据库搭建为 *.edmx 模型,以及用于编辑在哪个公司工作的员工的编辑视图。

我遇到的一个问题是当用户输入失败并返回到它时,在编辑视图(下拉)中维护 SelectList。

DropDownList 从控制器绑定 ListItem:

编辑.cshtml

@Html.DropDownListFor(model => model.CompanyID, (SelectList)ViewData["CompanySelectList"])

成员控制器.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 也无济于事。

那么当发布到编辑操作时我需要再次构建 SelectList 吗?

我关心使用 session 来存储它,但害怕打破 MVC 设计模式。

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

4

1 回答 1

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
}

您所做的基本上是说,当您从编辑视图返回到服务器时,服务器应该重建视图数据并调用相同的视图,以便它可以填充列表。

有一种更好的方法可以创建一个包含当前模型和 a 的模型,list<companys> companies = new list<companys>();然后从数据库中再次填充它。再次,这个概念是相同的,只是使用强类型模型。

于 2013-03-28T02:01:05.923 回答