.net mvc dropdownlist选择的值未更新

时间:2013-03-04 21:45:15

标签: entity-framework html-select

我有两个模型定义如下:

public class Division
{
    public int DivisionID { get; set; }
    [Required]
    public string DivisionName { get; set; }
    public virtual Employee Contact{ set;get; }
    public virtual ICollection<Employee> Employees { get; set; }
}

public class Employee
{
  public int EmployeeID{ get; set; }
  public string Name{ get; set; }
  public virtual Division Division{set;get;}
}

实体框架在分区表中设置一个名为employee_employeeid的字段,如何为分部表中的联系人属性创建员工下拉列表。

这是我尝试过的,但没有任何内容被发送到数据库。

ViewBag.contact = new SelectList(db.Employees,"EmployeeID","Name");

在视图中我有:

@Html.DropDownList("contact",String.Empty)

我必须使用命名约定吗?

修改

POST动作:

[HttpPost]
public ActionResult Edit(Division division)
{
    if (ModelState.IsValid)
    {
        db.Entry(division).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    ViewBag.employeeid = new SelectList(
        db.Employees, "EmployeeID", "EmployeeFirstName", division.employee);

    return View(division);
}

2 个答案:

答案 0 :(得分:0)

我建议实际使用ViewData而不是ViewBag。在您的控制器中有以下内容:

var employees = db.Employees.Select(e => new DropDownItem{ Text = e.Name, Value = e.EmployeeID });
ViewData["Employees"] = employees;

然后,在您的视图中,请显示以下内容:

@Html.DropDownList("Contact", ((IEnumerable<DropDownItem>)(ViewData["Employees"])))

答案 1 :(得分:0)

我建议你在模型中公开一个外键属性。它使得对下拉列表的绑定和后来的更新变得更加容易。您的Division模型如下所示:

public class Division
{
    public int DivisionID { get; set; }
    [Required]
    public string DivisionName { get; set; }
    [ForeignKey("Contact")]
    public int ContactId { set;get; }
    public virtual Employee Contact { set;get; }
    public virtual ICollection<Employee> Employees { get; set; }
}

然后在编辑GET操作中,您按照以下方式填写ViewBag

ViewBag.Contacts = new SelectList(
    db.Employees, "EmployeeID", "Name", division.ContactId);

您有一个强类型视图,其中Division为模型:

@model MyNamespace.Division

在此视图中,您可以将下拉列表绑定到ContactId属性:

@Html.DropDownListFor(model => model.ContactId, ViewBag.Contacts)

您的POST操作可能与您当前的版本类似:

[HttpPost]
public ActionResult Edit(Division division)
{
    if (ModelState.IsValid)
    {
        db.Entry(division).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    ViewBag.Contacts = new SelectList(
        db.Employees, "EmployeeID", "Name", division.ContactId);

    return View(division);
}

请注意,在许多情况下,为视图使用特殊的ViewModel而不是数据库实体是更好的做法(特别是出于安全考虑)。然后,您可以将Contacts集合合并到ViewModel中(而不是使用ViewBag)。要更新数据库中的实体,您可以加载它并将已更改的属性从ViewModel写入实体,然后保存它。

相关问题