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 JOIN
或Include
的视图中基于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)
你有几个问题:
Include
的参数应该是实体上的导航 属性,而不是 table 名称。换句话说,将其更改为:
var list_item = db.mst_item.Include("unit_id").ToList();
您必须通过 导航 属性 访问第二个实体的属性 。换句话说,这是您需要的视图代码:
@foreach (var item in Model)
{
@Html.DisplayFor(modelItem => item.item_name)
@Html.DisplayFor(modelItem => item.unit_id.unit_name)
}
也就是说,您这里也有一些文体问题,因为您是新手,我会指出来。
- Class 和 属性 名称应该是驼峰式的,即
MstItem
,而不是 mst_item
.
- 导航属性应该以它们连接的对象命名,即
unit_id
应该类似于 MstItemUnit
,或者只是 Unit
,如果您愿意的话。这也消除了为其指定显示名称的需要。
- 在此导航 属性 上使用
_id
后缀特别麻烦,因为它暗示此 属性 是 int
或 Guid
- 你知道,可以使用 id 的东西 - 而实际上你引用的是一个完整的对象。
- 虽然不那么重要,但在 class 的 属性 名称中重复 class 名称或其一部分毫无意义。例如,
unit_name
应该只是 Name
。显然,它是单位的名称,因为那是 class.
有了这些,您的代码将变得更具可读性和 "human"。例如:
@Html.DisplayFor(m => item.Name)
@Html.DisplayFor(m => item.Unit.Name)
我开始学习 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 JOIN
或Include
的视图中基于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)
你有几个问题:
Include
的参数应该是实体上的导航 属性,而不是 table 名称。换句话说,将其更改为:var list_item = db.mst_item.Include("unit_id").ToList();
您必须通过 导航 属性 访问第二个实体的属性 。换句话说,这是您需要的视图代码:
@foreach (var item in Model) { @Html.DisplayFor(modelItem => item.item_name) @Html.DisplayFor(modelItem => item.unit_id.unit_name) }
也就是说,您这里也有一些文体问题,因为您是新手,我会指出来。
- Class 和 属性 名称应该是驼峰式的,即
MstItem
,而不是mst_item
. - 导航属性应该以它们连接的对象命名,即
unit_id
应该类似于MstItemUnit
,或者只是Unit
,如果您愿意的话。这也消除了为其指定显示名称的需要。 - 在此导航 属性 上使用
_id
后缀特别麻烦,因为它暗示此 属性 是int
或Guid
- 你知道,可以使用 id 的东西 - 而实际上你引用的是一个完整的对象。 - 虽然不那么重要,但在 class 的 属性 名称中重复 class 名称或其一部分毫无意义。例如,
unit_name
应该只是Name
。显然,它是单位的名称,因为那是 class.
有了这些,您的代码将变得更具可读性和 "human"。例如:
@Html.DisplayFor(m => item.Name)
@Html.DisplayFor(m => item.Unit.Name)