Ich entwickle meine erste ASP.NET MVC-App und was ich erreichen möchte, ist eine gemeinsame Liste in einem Abschnitt auf jeder Seite anzuzeigen. In meinem Fall habe ich eine _Layout.cshtml, die eine Kopfzeile, Fußzeile, Hauptbereich und eine linke Seitenleiste hat, wo ich immer eine Liste von Elementen aus einer DB abgerufen anzeigen möchte.
Wenn ich etwas tue wie:
@RenderSection("BestSellingFlavors")
in der _Layout.cshtml, kann ich jede bestimmte Ansicht seine "BestSellingFlavors" Abschnitt dort anzeigen lassen, aber in meinem Fall ist dies eine Standardliste aus einer Datenbank abgerufen - etwas, das ich immer auf der Seitenleiste angezeigt werden soll, unabhängig davon, welche Seite der Benutzer angezeigt wird. Macht das Sinn?
Derzeit habe ich einen Controller/Modell/Ansicht, die eine Ansicht der meistverkauften Aromen in unserem Inventar bietet, aber ich bin nicht sicher, wie diese Informationen abgerufen und angezeigt werden, ohne ein Bündel von Code in jedem Controller/Ansicht zu duplizieren.
Eine Idee war ein BaseController, der die Abfrage der Bestseller übernimmt. Etwas wie dies:
public abstract class BaseController : Controller
{
public PartialViewResult BestSellers()
{
try
{
var db = IceCreamDBData();
var all = db.Sales.AsEnumerable();
var bestsellers = from a in all select new {a.Name, a.UnitsSold};
return PartialView("BestSellers", bestsellers);
}
catch (Exception)
{
throw;
}
}
}
Meine verschiedenen Controller würden von BaseController erben. Aber dann bin ich stecken fragen, wie dies tatsächlich aufgerufen wird und wo die Ansicht Code liegt, dass würde @foreach
diese Sammlung von Daten und zeigt sie an. Das lässt mich glauben, dass ich das Problem falsch angehe. Wie sollte Soll ich das Problem lösen?
UPDATE: Die Lösung und der Link von J.W. haben mich auf den Weg gebracht, und jetzt bin ich (vermutlich) auf dem richtigen Weg.
In meiner _Layout.cshtml habe ich ein div:
<div id="BestSellers">
@Html.Action("BestSellers")
</div>
dann habe ich eine partielle Ansicht im Ordner "Shared" mit dem Namen _BestSellersPartial.cshtml erstellt, die etwa so aussieht:
@model HometownIceCream.Models.BestSellersViewModel
<h3>Best Sellers</h3>
@foreach (var item in Model.Entries)
{
<div>@item.Name</div>
}
Und dann sieht mein BaseController wie folgt aus:
public abstract class BaseController : Controller
{
public PartialViewResult BestSellers()
{
try
{
var db = IceCreamDBData();
var all = db.Sales.AsEnumerable();
var bestsellers = from a in all select new {a.Name, a.UnitsSold};
BestSellersViewModel mod = new BestSellersViewModel() {Entries = bestsellers};
return PartialView("_BestSellersPartial", mod);
}
catch (Exception)
{
throw;
}
}
}
Und das scheint ganz gut zu funktionieren. Das Einzige, was ich für meine Controller tun musste, war, dass sie erben BaseController
statt Controller
.