动态设置视图标题

时间:2017-04-02 21:27:47

标签: c# asp.net asp.net-mvc

甚至不确定我是否以正确的方式提出问题。一直在看这个约一个小时,太简单了。麻烦的是我太简单了解答案,甚至没有正确地说出搜索来找到答案。

我已经为网站设置完成了工作历史。

控制器:

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

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

1 个答案:

答案 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)