甚至不确定我是否以正确的方式提出问题。一直在看这个约一个小时,太简单了。麻烦的是我太简单了解答案,甚至没有正确地说出搜索来找到答案。
我已经为网站设置完成了工作历史。
控制器:
public async Task<IActionResult> JobSiteHistory(int id, int? page)
{
var jobs = from j in _context.Job
.Include(j => j.Site)
.Include(j=>j.WaterBody)
.Where(j=>j.Site.SiteID==id)
.OrderByDescending(j=>j.BookingDate)
select j;
int pageSize = 9;
return View(await PaginatedList<Job>.CreateAsync(jobs.AsNoTracking(), page ?? 1, pageSize));
}
这会使正确的记录恢复正常。
然后我设置了一个视图:
<h2> Site Jobs History</h2>
<p>
<a asp-action="Create">Add New Job</a>
</p>
<table class="table">
<thead>
<tr>
<th>Booking Date</th>
<th>Job Number</th>
<th>Waterbody</th>
<th>Job Description</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) {
<tr>
<td>@Html.DisplayFor(modelItem => item.BookingDate)</td>
<td>@Html.DisplayFor(modelItem => item.JobNumber)</td>
<td>@Html.DisplayFor(modelItem => item.WaterBody.WBName)</td>
<td>@item.JobDescription.Substring(0, Math.Min(item.JobDescription.Length, 30))</td>
<td>
<a asp-action="Edit" asp-route-id="@item.JobID">Edit</a> |
<a asp-action="Details" asp-route-id="@item.JobID">Details</a> |
<a asp-action="Delete" asp-route-id="@item.JobID">Delete</a> |
</td>
</tr>
}
</tbody>
</table>
到目前为止,这种方法运作良好。
我想做的就是添加以下内容:
@Html.DisplayFor(ModelItem=>item.Site.SiteName)
到<h2>
元素。我知道这不会像打字那样工作,感谢您的想法。
我无法看到添加它的方法。我考虑了ViewData
,但可能使用了它,因为我无法填充SiteName
。
有没有办法做到这一点,还是我像往常一样思考所有屁股?
答案 0 :(得分:1)
最简单的改变就是使用它:
<h2>@Html.DisplayFor(m => m[0].Site.SiteName);</h2>
其他选择:
您有什么理由不能使用ViewBag吗? 在控制器中:
ViewBag.SiteName = Site.name
在视图中:
<h2>@ViewBag.SiteName</h2>
如果必须使用模型传递整个网站对象,请更改传递给视图的视图模型。
您当前正在返回包含每个作业的网站对象的作业列表,但看起来您只需要一次。
我会将您的视图模型更改为:
public class SiteJobsHistoryModel
{
public Site Site { get; set;}
public PaginatedList<Job> Jobs { get; set; }
}
然后,您不必在查询中包含该网站,只需从数据库中检索一次:
var site = _context.Site.Single(j => j.Site.SiteID==id);
var jobs = from j in _context.Job
//.Include(j => j.Site) -- this can be removed
.Include(j=>j.WaterBody)
.Where(j=>j.Site.SiteID==id)
.OrderByDescending(j=>j.BookingDate)
select j;
return View(new SiteJobsHistoryModel
{
Site = site,
Jobs = await PaginatedList<Job>.CreateAsync(jobs.AsNoTracking(), page ?? 1, pageSize)
});
然后,对于<h2>
标记中的标题,您可以使用:
@Html.DisplayFor(ModelItem=>model.Site.SiteName)
你的foreach循环变为:
@foreach (var item in Model.Jobs)