【问题标题】:ASP.net MVC DropLownList db.SaveChanges not saving selectionASP.net MVC DropLownList db.SaveChanges 不保存选择
【发布时间】:2012-08-31 21:55:46
【问题描述】:

我浏览了大量关于如何在 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(...) 行上设置断点时,我在 itemmodel.Color 的 Locals 窗口中显示:

{System.Data.Entity.DynamicProxies.ColorModel_0EB80C07207CA5D88E1A745B3B1293D3142FE2E644A1A5202B90E5D2DAF7C2BB}

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

【问题讨论】:

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


    【解决方案1】:

    您不需要设置整个Color 对象。只需设置ColorId 属性即可。

    改变

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

    itemmodel.ColorId = itemEditModel.ColorID;
    

    编辑

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

    按照约定,外键属性的名称应该是ColorId。在您的 ItemModel 类中添加此 int 属性。

    【讨论】:

    • 我的 ItemModel 有一个名为 Color 的 ColorModel 属性,但它没有 ColorID 属性。 ColorID 位于 Color 属性内。我需要修改我的 ItemModel 吗?
    • 我尝试使用itemmodel.Color.ColorID = itemEditModel.ColorID;,但这也没有用。
    • @WMIF:很抱歉,我没有注意到ItemModel 中没有类似ColorId 的内容。是的,您需要添加它。检查编辑。
    • 感谢@Mohayemin 的澄清。我熟悉数据库中的外键关系。我已经做了很多年的 web 开发和数据库工作,但是这个 EF 和 CodeFirst 的东西对我来说仍然是新的。我认为拥有 ColorModel 访问器是 EF 构建 FK 的一部分。 ColorID 现在正在保存到数据库中。我只需要处理其他视图以显示颜色名称而不是 ID。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多