2

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が表示されますが、データベースに保存されません。

4

1 に答える 1

1

Colorオブジェクト全体を設定する必要はありません。ColorIdプロパティを設定するだけです。

変化する

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

itemmodel.ColorId = itemEditModel.ColorID;

編集

データベースにはオブジェクト全体が格納されていないことに注意してください。のColorオブジェクトは、外部キーによって関連付けられているエンティティItemModelにアクセスするための便利な方法です。ColorModel

慣例に従い、外部キープロパティの名前は。である必要がありますColorIdintこのプロパティをItemModelクラスに追加します。

于 2012-09-07T03:22:49.853 に答える