0

我有两个模型定义如下:

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)

我必须使用命名约定吗?

编辑

发布操作:

[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);
}
4

2 回答 2

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; }
}

然后在 Edit GET 操作中填写ViewBag您所做的:

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

你有一个带有Divisionas 模型的强类型视图:

@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 中更改的属性写入实体,然后保存它。

于 2013-03-05T18:38:10.893 回答
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"])))
于 2013-03-04T21:55:57.630 回答