2017-04-02 5 views
0

Nicht einmal sicher, ob ich die Frage richtig gestellt habe. Ich habe es etwa eine Stunde lang angeschaut und es ist zu einfach, es zu lange zu nehmen. Problem ist, dass ich zu einfach bin, um die Antwort zu wissen, oder sogar, wie man eine Suche richtig formuliert, um die Antwort zu finden.Dynamisch festlegen Titel anzeigen

Ich habe eine Geschichte von Jobs abgeschlossen für eine Website eingerichtet.

Controller:

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)); 
} 

Dies wird die korrekten Datensätze alle gut zurück.

Ich habe dann eine Ansicht ein:

<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> 

Dies ist bisher arbeiten wellish.

Alles, was ich tun möchte, ist wie etwas hinzufügen:

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

Zum <h2> Element. Ich weiß, dass das nicht wie eingegeben funktionieren wird, danke für das Denken.

Ich kann nur einen Weg sehen, es hinzuzufügen. Ich dachte ViewData, aber kann es falsch verwenden, wie ich es nicht mit SiteName bevölkern kann.

Gibt es eine Möglichkeit, dies zu tun, oder denke ich über alles wie gewohnt?

<h2>@Html.DisplayFor(m => m[0].Site.SiteName);</h2> 

Weitere Optionen::

Gibt es einen Grund, warum Sie nicht die ViewBag können

+0

Ihr Modell ist eine Sammlung, kein einzelnes Objekt, und eine Sammlung hat keine Eigenschaft namens "Site".Es ist nicht klar, was Sie anzeigen möchten. Enthält Ihre Sammlung Objekte, deren "Site" (und ihr 'SiteName') alle gleich sind? –

Antwort

1

dies die einfachste Änderung verwenden wäre? In Controller:

ViewBag.SiteName = Site.name 

In Ansicht:

<h2>@ViewBag.SiteName</h2> 

Wenn Sie Ihr Modell verwenden, muss die gesamte Website zu übergeben Objekt dann Ihrer Ansicht nach Modell ändern, die Sie zur Ansicht übergeben.

Sie geben derzeit eine Liste von Jobs mit dem Site-Objekt für jeden Job zurück, aber es sieht so aus, als ob Sie sie nur einmal benötigen.

würde ich Ihrer Ansicht nach Modell ändern, etwas zu sein wie:

public class SiteJobsHistoryModel 
{ 
    public Site Site { get; set;} 
    public PaginatedList<Job> Jobs { get; set; } 
} 

Dann müssen Sie nicht über die Website auf Ihre Abfrage aufnehmen und abrufen es nur einmal aus der Datenbank:

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) 
    }); 

Dann für den Titel in <h2> Tag können Sie:

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

Und Ihre foreach Schleife kommt:

Verwandte Themen