3

別のテーブルからの 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 から変更する必要があっても変更しません。

これを機能させるにはどうすればよいですか?

4

1 に答える 1

1

プロパティItemTypeIdをItemエンティティに追加して、外部キーとして機能するようにする必要があります。

public class Item
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    public int ItemTypeId { get; set; }

    [ForeignKey("ItemTypeId")]
    public virtual ItemType ItemType { get; set; }
}

次に、そのプロパティをドロップダウンリストに使用できます。

<div class="editor-field">
    @Html.DropDownListFor(x => x.ItemTypeId, (SelectList)ViewBag.ItemType)
    @Html.ValidationMessageFor(model => model.ItemType) 
</div>
于 2012-07-18T20:44:11.603 に答える