Asp.net mvc 如何在MVC索引页中显示导航属性集合中的值
我有一个名为“JobTitle”的EF实体类型,它有一个名为“Office”的导航属性,它是另一个名为“Office”的实体类型的集合 我想在我的索引视图中显示职务名称和相关办公室名称的列表。 默认情况下,视图脚手架生成了以下内容:Asp.net mvc 如何在MVC索引页中显示导航属性集合中的值,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我有一个名为“JobTitle”的EF实体类型,它有一个名为“Office”的导航属性,它是另一个名为“Office”的实体类型的集合 我想在我的索引视图中显示职务名称和相关办公室名称的列表。 默认情况下,视图脚手架生成了以下内容: @model IEnumerable<Example.Models.JobTitle> @{ ViewBag.Title = "Index"; } <h2>Index</h2> <table> &
@model IEnumerable<Example.Models.JobTitle>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.JobTitleName)
</th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.JobTitleName)
</td>
</tr>
}
</table>
这将允许我生成属于“JobTitle”的所有简单属性,例如“JobTitleName”。但是,我无法确定如何将“Office”集合导航属性中相应的“Office”信息检索到我的视图中
因此,我希望最后能显示两列:“JobTitle”和“Office”
在我的数据库中,这些实体由三个表表示:JobTitle JobTitleID、JobTitleName、Office OfficeID、OfficeName和JobTitleOffice JobTitleID、OfficeID
我是MVC和实体框架的新手,所以非常感谢您的帮助
谢谢 您可以使用和将结果投影到JobTitleName和OfficeName的集合中 更多
将来,如果有这样的问题,最好发布实际的实体类。然而,根据您的表格,看起来您的职位和办公室之间存在多对多关系。您的困难很可能与如何访问特定JobTitle实例的OfficeName属性有关,问题在于OfficeName不只是一个,而是很多。你需要反复浏览办公室列表 或者,如果您只关心显示单个办公室的名称,则可以使用FirstOrDefault拉出单个办公室:
<td>
@Html.DisplayFor(modelItem => item.JobTitleName)
@{
var office = item.Offices.FirstOrDefault();
if (office != null)
{
@Html.DisplayFor(m => office.OfficeName);
}
}
</td>
如果您尝试执行以下操作:
@foreach (var office in item.Offices)
{
@office.OfficeName
<address>
@office.Address.Street
...
</address>
}
这将导致实体框架进行连接,将办公室和每个办公室实例的每个地址都包含在查询中,以获取职务。然后,您可以根据需要对这些信息执行任何操作,而无需担心会发出多个附加查询。谢谢Chris,非常有用的解释。
public class JobTitle
{
// other properties
public string JobTitleName { get; set; }
public virtual ICollection<Office> Offices { get; set; }
}
public class Office
{
// other properties
public string OfficeName { get; set; }
public virtual ICollection<JobTitle> JobTitles { get; set; }
}
<td>
@Html.DisplayFor(modelItem => item.JobTitleName)
@foreach (var office in item.Offices)
{
@Html.DisplayFor(m => office.OfficeName)
}
</td>
<td>
@Html.DisplayFor(modelItem => item.JobTitleName)
@string.Join(", ", item.Offices.Select(m => m.OfficeName))
</td>
<td>
@Html.DisplayFor(modelItem => item.JobTitleName)
@{
var office = item.Offices.FirstOrDefault();
if (office != null)
{
@Html.DisplayFor(m => office.OfficeName);
}
}
</td>
public class Office
{
...
public virtual Address Address { get; set; }
}
@foreach (var office in item.Offices)
{
@office.OfficeName
<address>
@office.Address.Street
...
</address>
}
return View(db.JobTitles.Include("Offices.Address").ToList());