別のテーブルからの ItemType を持つアイテムを作成しようとしています。Create ページから実際の Type オブジェクトを取得できません。これは私が試したコードです:
モデル:
public class ItemType {
public int Id { get; set; }
[Required]
public string Name { get; set; }
public virtual ICollection<Item> Item{ get; set; }
}
public class Item {
public int Id { get; set; }
[Required]
public string Name { get; set; }
public virtual ItemType ItemType { get; set; }
}
ItemController では、これが私の作成コードです。
public ActionResult Create() {
var itemTypeRepo = new ItemTypeRepository(context);
ViewBag.ItemTypes = new SelectList(itemTypeRepo.GetAll(), "ID", "Name");
return View();
}
[HttpPost]
public ActionResult Create(Item item) {
if (ModelState.IsValid) {
context.Items.Add(item);
context.SaveChanges();
return RedirectToAction("Index");
}
return View(item);
}
私のCreate.cshtmlビューで試しました:
<div class="editor-field">
@Html.DropDownList("ItemType", String.Empty)
@Html.ValidationMessageFor(model => model.ItemType)
</div>
これは値をまったく返さず、「値 'X' は無効です」というエラーをスローします。X は、選択した ItemType の ID です。と
<div class="editor-field">
@Html.DropDownListFor(x => x.ItemType.Id, (SelectList)ViewBag.ItemType)
@Html.ValidationMessageFor(model => model.ItemType)
</div>
これにより、正しい ID を持つスタブ ItemType オブジェクトが作成されますが、オブジェクトが完全にロードされていないため、データベースには挿入されません。ModelState オブジェクトを見ると、ItemType オブジェクトに Name フィールドがないというエラーが表示されています。
また、2 番目の .cshtml コードを使用して、次のコードを追加して問題を解決しようとしました。
public ActionResult Create(Item item) {
item.ItemType = context.ItemTypes.Find(item.ItemType.Id);
if (ModelState.IsValid)
これは、ModelState.IsValid の値を false から変更する必要があっても変更しません。
これを機能させるにはどうすればよいですか?