ASP.net MVC DropLownList db.SaveChanges不保存选择

时间:2012-09-07 02:28:06

标签: asp.net-mvc-3 entity-framework razor

我已经查看了大量有关如何在MVC中使用DropDownList的教程和建议。我能够使大部分工作,但所选项目不保存到数据库中。我正在使用MVC 3和Razor作为视图。

我的DropDownList是使用正确的值和漂亮的HTML创建的。当我设置断点时,我可以看到模型中正确选择的项目ID被发送到控制器。当视图返回索引时,不设置DropDownList值。其他值保存得很好。

以下是相关观点。 DropDownList将ColorModel名称列表显示为文本,ID为值。

public class ItemModel
{
    [Key]
    public int ItemID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public virtual ColorModel Color { get; set; }
}
public class ItemEditViewModel
{
    public int ItemID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public int ColorID { get; set; }
    public IEnumerable<SelectListItem> Colors { get; set; }
}
public class ColorModel
{
    [Key]
    public int ColorID { get; set; }
    public string Name { get; set; }
    public virtual IList<ItemModel> Items { get; set; }
}

以下是控制器操作。

    public ActionResult Edit(int id)
    {
        ItemModel itemmodel = db.Items.Find(id);
        ItemEditViewModel itemEditModel;
        itemEditModel = new ItemEditViewModel();
        itemEditModel.ItemID = itemmodel.ItemID;
        if (itemmodel.Color != null) {
            itemEditModel.ColorID = itemmodel.Color.ColorID;
        }
        itemEditModel.Description = itemmodel.Description;
        itemEditModel.Name = itemmodel.Name;
        itemEditModel.Colors = db.Colors
            .ToList()
            .Select(x => new SelectListItem
                {
                    Text = x.Name,
                    Value = x.ColorID.ToString()
                });
        return View(itemEditModel);
    }

    [HttpPost]
    public ActionResult Edit(ItemEditViewModel itemEditModel)
    {
        if (ModelState.IsValid)
        {
            ItemModel itemmodel;
            itemmodel = new ItemModel();
            itemmodel.ItemID = itemEditModel.ItemID;
            itemmodel.Color = db.Colors.Find(itemEditModel.ColorID);
            itemmodel.Description = itemEditModel.Description;
            itemmodel.Name = itemEditModel.Name;
            db.Entry(itemmodel).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(itemEditModel);
    }

视图对DropDownList有这个,其他的只是EditorFor()。

@Html.DropDownListFor(model => model.ColorID, Model.Colors, "Select a Color")

当我在db.Color.Find(...)行设置断点时,我会在locals窗口中显示itemmodel.Color:

  

{System.Data.Entity.DynamicProxies.ColorModel_0EB80C07207CA5D88E1A745B3B1293D3142FE2E644A1A5202B90E5D2DAF7C2BB}

当我展开该行时,我可以看到我从下拉框中选择的ColorID,但它不会保存到数据库中。

1 个答案:

答案 0 :(得分:1)

您无需设置整个Color对象。只需设置ColorId属性。

更改

itemmodel.Color = db.Colors.Find(itemEditModel.ColorID);

itemmodel.ColorId = itemEditModel.ColorID;

修改

请注意,您的数据库不存储整个对象。 Color中的ItemModel对象只是访问由外键关联的ColorModel实体的便捷方式。

根据惯例,外键属性的名称应为ColorId。在int课程中添加此ItemModel媒体资源。