我有两个模型定义如下:
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);
}
答案 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写入实体,然后保存它。