4 Stimmen

Razor _Layout.cshtml gemeinsamer Abschnitt von einem bestimmten Controller

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 .

3voto

J.W. Punkte 17431

Ich denke Html.RenderAction ist das, was Sie brauchen. Mit dieser Methode können Sie einen gemeinsamen Bereich wie ein Menü erstellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X