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 字段的错误。

我还尝试使用第二个 .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 回答