2017-04-02 71 views
0

甚至不知道我是否以正确的方式提出问题。一直在看这个约一个小时,它太简单,需要很长时间。麻烦的是我太简单,无法知道答案,甚至不知道如何正确地使用搜索来找到答案。动态设置查看标题

我有一个网站建立完成的工作的历史。

控制器:

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> 

这是工作wellish至今。

所有我想要做的就是添加类似:

@Html.DisplayFor(ModelItem=>item.Site.SiteName) 

<h2>元素。我知道这不会像打字一样工作,谢谢你的想法。

我只是不能看到一种方式来添加它。我认为ViewData,但可能会使用它错误,因为我不能让它填充SiteName

有没有办法做到这一点,还是我像往常一样思考所有的屁股?

+0

你的模型是一个集合,而不是一个单一的对象,并收集没有一个名为'Site'财产。它不清楚你想要展示什么。您的集合中是否包含每个“Site”(及其“SiteName”)都相同的对象? –

回答

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)