MVCでDropDownListを操作する方法について、たくさんのチュートリアルと提案を調べました。ほとんど動作させることができましたが、選択したアイテムがデータベースに保存されていません。ビューにはMVC3とRazorを使用しています。
私のDropDownListは、正しい値と見栄えの良いHTMLで作成されています。ブレークポイントを設定すると、モデル内の正しい選択されたアイテムIDがコントローラーに送信されているのを確認できます。ビューがインデックスに戻ると、DropDownList値は設定されません。他の値は問題なく保存されます。
関連するビューは次のとおりです。DropDownListは、IDを値として、ColorModel名のリストをテキストとして表示しています。
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の[ローカル]ウィンドウにこれが表示されます。
{System.Data.Entity.DynamicProxies.ColorModel_0EB80C07207CA5D88E1A745B3B1293D3142FE2E644A1A5202B90E5D2DAF7C2BB}
その行を展開すると、ドロップダウンボックスから選択したColorIDが表示されますが、データベースに保存されません。