Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework .net mvc dropdownlist所选值未更新_Entity Framework_Html Select - Fatal编程技术网

Entity framework .net mvc dropdownlist所选值未更新

Entity framework .net mvc dropdownlist所选值未更新,entity-framework,html-select,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; se

我有两个模型定义如下:

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;}
}
我认为:

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

我建议实际使用
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"])))
@Html.DropDownList(“联系人”,((IEnumerable)(ViewData[“员工]))

我建议您在模型中公开外键属性。它使到下拉列表的绑定和以后的更新更加容易。您的
部门
模型如下所示:

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; }
}
您有一个强类型视图,其
部分作为模型:

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

@Html.DropDownListFor(model => model.ContactId, ViewBag.Contacts)
您的后期操作可能与当前版本类似:

[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,而不是数据库实体。然后,您可以将
联系人
集合合并到ViewModel中(而不是使用
查看包
)。要更新数据库中的实体,您需要加载它并将更改的属性从ViewModel写入实体,然后保存它。

为什么
ViewData
优于
ViewBag
?这样您就不必担心动态变量可能会给您带来问题。此外,您还可以非常轻松地对其调用
.ContainsKey()
,以确保该键存在于字典中。如何更新数据库中的分区?
[HttpPost]公共操作结果编辑(分区){if(ModelState.IsValid){db.Entry(分区).State=EntityState.Modified;db.SaveChanges();return RedirectToAction(“Index”);}ViewBag.employeeid=新选择列表(db.Employees,“employeeid”,“EmployeeFirstName”,division.employee);return View(division);}
@Html.DropDownListFor(model => model.ContactId, ViewBag.Contacts)
[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);
}