2017-04-02 40 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)