ASP.NET MVC 4 使用 EF 显示来自 2 模型的数据

ASP.NET MVC 4 Display data From 2 Model using EF

我开始学习 ASP.NET MVC 4 并且一直在 1 个文件中显示来自 2 个模型的数据 这是我的模特

 public class mst_item
{
    [Key]
    [DisplayName("Item Code")]
    [Required]
    public string item_code{get;set;}

    [DisplayName("Item Name")]
    [Required]
    public string item_name{get;set;}        

    [DisplayName("Unit")]
    [Required]
    public mst_item_unit unit_id{ get; set; }

}


public class mst_item_unit
{
    [Key]
    public int unit_id { get; set; }

    [DisplayName("Unit")]
    public string unit_name { get; set; }


}

然后我的控制器:

 public ActionResult Item()
 {
        var list_item = db.mst_item.Include("mst_item_unit").ToList();

        return View(list_item);
 }

那么如何在使用INNER JOINInclude的视图中基于mst_item.unit_id显示unit_name?像:

@foreach (var item in Model)
{
      @Html.DisplayFor(modelItem => item.item_name)
      @Html.DisplayFor(modelItem => item.unit_name)
}

我卡在这里了,但是我在没有加入mst_item_unit(只显示基于mst_item.unit_id的ID)之前显示mst_item数据时成功了。

您应该创建一个 ViewModel 来关联您的两个模型,在您的控制器中填充该 ViewModel 并在您的视图中使用它。下面的 link 非常符合您的情况。 Multiple Models in a Single View (C# MVC3)

你有几个问题:

  1. Include 的参数应该是实体上的导航 属性,而不是 table 名称。换句话说,将其更改为:

    var list_item = db.mst_item.Include("unit_id").ToList();
    
  2. 您必须通过 导航 属性 访问第二个实体的属性 。换句话说,这是您需要的视图代码:

    @foreach (var item in Model)
    {
        @Html.DisplayFor(modelItem => item.item_name)
        @Html.DisplayFor(modelItem => item.unit_id.unit_name)
    }
    

也就是说,您这里也有一些文体问题,因为您是新手,我会指出来。

  1. Class 和 属性 名称应该是驼峰式的,即 MstItem,而不是 mst_item.
  2. 导航属性应该以它们连接的对象命名,即 unit_id 应该类似于 MstItemUnit,或者只是 Unit,如果您愿意的话。这也消除了为其指定显示名称的需要。
  3. 在此导航 属性 上使用 _id 后缀特别麻烦,因为它暗示此 属性 是 intGuid - 你知道,可以使用 id 的东西 - 而实际上你引用的是一个完整的对象。
  4. 虽然不那么重要,但在 class 的 属性 名称中重复 class 名称或其一部分毫无意义。例如,unit_name 应该只是 Name。显然,它是单位的名称,因为那是 class.

有了这些,您的代码将变得更具可读性和 "human"。例如:

@Html.DisplayFor(m => item.Name)
@Html.DisplayFor(m => item.Unit.Name)