2016-07-22 18 views
1

Ich muss paar Dropdown-Menüs auf der oberen rechten Seite meiner Anwendung setzen. Diese Menüs müssen auf jeder Seite angezeigt werden, auf der dieses Layout verwendet wird.Wie kann ich ein globales Menü für meine Anwendung erstellen, wenn die Elemente aus einer Datenbank stammen?

Das einzige Problem ist, dass Elemente des Menüs aus einer Datenbank abgerufen werden.

Normalerweise würde ich die Liste an das Modell übergibt, wie so

public ActionResult Clients() 
{ 
    using (SomeContext db = new SomeContext()) 
    { 
     var clients = db.Database.SqlQuery<Client>("SELECT * FROM clients").ToList(); 

     return View(clients); 
    } 
} 

Aber ich bin nicht sicher, wie die gleiche Sache zu tun, ohne den gleichen Code für jede Ansicht zu schreiben. Ich möchte diesen Code nur einmal schreiben und mich nicht darum sorgen, für jede Ansicht den gleichen Code schreiben zu müssen.

Was ist der richtige Weg, um ein globales Dropdown-Menü für meine Anwendung zu haben?

Antwort

2

Ich bevorzuge einen Controller, um mein Menü zu rendern. Dies bietet Caching, Wiederverwendung und Logik für ein Menü (wie zum Beispiel das Zeigen oder Nicht-Zeigen eines Menüs basierend auf Rollen/Ansprüchen). Sie können den vollständigen Artikel von Phil Haacked - Html.RenderAction and Html.Action, Auszug unten lesen.

C#

public class MenusController { 
    [ChildActionOnly] 
    public ActionResult MainMenu() { 
    var menu = GetMenuFromSomewhere(); 
    return PartialView(menu); 
    } 
} 

Html:

<html> 
<head><title></title></head> 
<body> 
    @Html.Action("MainMenu", "Menus") 
    <h1>Welcome to the Index View</h1> 
</body> 
</html> 
+0

Um sicherzustellen, dass ich das verstehe. Ich muss eine Ansicht namens 'MainMenu' erstellen, die eine Liste meiner Kunden akzeptiert und diese Ansicht erstellt nur das Menü. Dann muss ich hinzufügen '[ChildActionOnly] öffentlichen ActionResult MainMenu (' zu jedem Controller? Vielleicht würde ich die Vererbung dafür verwenden. – Jaylen

+0

Ich bekomme den folgenden Fehler 'Der Controller für Pfad '/ Tasks/Index' wurde nicht gefunden oder nicht implementieren Sie IController. Bitte beachten Sie http://stackoverflow.com/questions/38532446/the-controller-for-path-was-not-found-or-does-not-implement-icontroller – Jaylen

1

Sie können dazu einen Aktionsfilter erstellen.

public class LoadMenu : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var vb = filterContext.Controller.ViewBag; 
     var menu = new List<MenuItem>(); 
     //I am hard coding to 2 items here. You may read it from your db table 
     menu.Add(new MenuItem() { Text = "Home", TargetUrl = "Home/Index" }); 
     menu.Add(new MenuItem() { Text = "Careers", TargetUrl = "Home/Careers" }); 
     vb.Menus = menu; 
    } 
} 

Angenommen, Sie haben eine Klasse MenuItem genannt

public class MenuItem 
{ 
    public string Text { set; get; } 
    public string TargetUrl { set; get; } 

    public List<MenuItem> Childs { set; get; } 

    public MenuItem() 
    { 
     this.Childs = new List<MenuItem>(); 
    } 
} 

Nun, wenn Sie dies wollen auf jeder Seite, es global nur registrieren. Sie können dies in der RegisterRoutes Methode in RouteConfig Klasse

public static void RegisterRoutes(RouteCollection routes) 
{ 
    //Existing route definitions goes here 

    GlobalFilters.Filters.Add(new LoadMenu()); 
} 

Jetzt in Ihrem Layout-Datei, lesen Sie die ViewBag Element namens Menüs und das Menü Markup bauen je nach Bedarf.

@{ 
    var menu = ViewBag.Menus as List<MenuItem>; 
    if (menu != null) 
    { 
     foreach (var m in menu) 
     { 
      <li><a href="@m.TargetUrl">@m.Text</a></li> 
     } 
    } 
} 

Sie können den obigen Code aktualisieren Childs zu machen, wie gebraucht.

+0

Danke. Kannst du mir helfen zu verstehen, was "ActionFilterAttribute" und die "OnActionExecuted" -Methode sind? Wie könnte der GlobalFilter den View-Bad-Item 'Menu' nennen? – Jaylen

+0

Siehe die aktualisierte Antwort. Ihr Code im Layout liest die Elemente der Ansichtstasche und erstellt das Menü. Bitte lesen Sie auch http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/understanding-action-filters-cs – Shyju