2013-03-04 84 views
0

我定义了两个型号如下:.NET MVC下拉列表中选择值未更新

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

如何更新数据库中的分区? – Slauma 2013-03-04 22:18:07

+0

'[HttpPost] 公共的ActionResult编辑(司除法) { 如果(ModelState.IsValid) { db.Entry(除法).STATE = EntityState.Modified; db。保存更改(); return RedirectToAction(“Index”); } ViewBag.employeeid = new SelectList(db.Employees,“EmployeeID”,“EmployeeFirstName”,division.employee); return查看(师); }' – mpora 2013-03-04 22:24:25

回答

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"]))) 
+0

为什么'ViewData'比'ViewBag'更受青睐? – mpora 2013-03-04 21:58:30

+0

这样你就不必担心可能会给你带来问题的动态变量。另外你可以很容易地调用'.ContainsKey()'来确保该键在字典中出现。 – IronMan84 2013-03-04 21:59:53

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

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