查看详细信息时,Model的属性为null

时间:2013-12-28 14:07:33

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我已经定义了一个模型Item,它具有以下属性:

public class Item
{
    public bool Active { get; set; }
    public string ItemCode { get; set; }

    public int ItemId { get; set; }
    public string Name { get; set; }

    public Category Category { get; set; }
    public int CategoryId { get; set; }

}

我试图在Item控制器的详细视图中引用Category。我在控制器中的代码是:

public ActionResult Details(int id = 0)
{
    Item item = db.Items.Find(id);
    if (item == null)
    {
        return HttpNotFound();
    }
    return View(item);
}

但是,当我在这里探索item对象时,我可以看到CategoryId被正确设置,Category属性被设置为null。因此,当我引用Item.Category.Name时,我得到一个空白的结果。我已经尝试将我的属性设置为虚拟(遵循在线教程),但这似乎没有解决问题。我做错了什么?

1 个答案:

答案 0 :(得分:2)

您可以通过将Category标记为虚拟来延迟加载该属性:

public virtual Category Category { get; set; }

一旦您访问Category属性,这将向数据存储发送另一个查询,询问相关类别。例如item.Category.Name

或者您可以使用Include方法急切加载类别:

Item item = db.Items
              .Include(item => item.Category)
              .FirstOrDefault(item => item.ID == id);

这将从1个查询中的数据存储中检索包含相关类别的项目。请注意,我在FirstOrDefault使用Find代替this article,因为Include的返回类型为IQueryable<T>而非DbSet<T>

有关加载相关数据的详情,请参阅{{3}}。