2009-04-28 10 views
1

Ich habe eine Datenbankmenüstruktur, die ich der site.master-Datei hinzufügen möchte.ASP.NET MVC - Datenbankgesteuertes Menü

Ich habe mir andere Fragen zu StackOverflow angeschaut, aber ich kann das nicht auf meiner Website finden.

Wie füge ich ein Benutzersteuerelement zur Site.Master-Datei hinzu?

Menu.ascx

<%foreach (MainMenuSort mainMenuSort in (List<MainMenuSort>)ViewData["MainMenuSortListDisplay"]) 
     { %> 
     <li><%= Html.Encode(mainMenuSort.MainMenuId.MainMenuName)%></li> 
     <%foreach (SubMenuSort subMenuSort in (List<SubMenuSort>)ViewData["SubMenuSortListDisplay"]) 
      {%> 
      <%if (mainMenuSort.MainMenuId.Id == subMenuSort.SubMenuId.MainMenu.Id) 
       { %> 
       <li><%= Html.Encode(subMenuSort.SubMenuId.SubMenuName)%></li> 
      <%} %> 
     <%} %> 
     <%}%> 

Antwort

0

Mit Hilfe dieser link. Ich konnte auf der site.master-Seite ein Menü anzeigen.

3

Sie benötigen die Html.RenderPartial Methode in Ihrer Master-Seite nutzen zu können.

Sie müssen die Ansichtsschlüssel MainMenuSortListDisplay und SubMenuSortListDisplay in jeder Aktion festlegen, die die Ansicht aufruft, die Ihre Masterseite verwendet.

In Ihrer Master Verwendung diesen

<% Html.RenderPartial("~/Views/Shared/Menu.ascx"); 

Der Pfad muss die App relative Pfad zum Ordner des Kontrolle. In der Regel gehen diese unter Shared. Sie können die Struktur wie gewünscht unterhalb des freigegebenen Ordners erstellen.

Um diese Technik zu verstärken, verwenden Sie eine stark typisierte partielle. In der Frage würden Sie vielleicht eine neue Klasse (MenuModel) mit zwei generischen Sammlungen als Eigenschaften erstellen und sie in den Modellordner der Anwendung einfügen. Rufen Sie dann im Konstruktor des Modells eine Methode auf, die die Listen auffüllt.

public class MenuModel 
{ 
    public IEnumerable<MainMenuSort> OuterList {get; set;} 
    public IEnumerable<SubMEnuSort> InnerList {get; set;} 
    public MenuModel() 
    { 
     VoidThatFillsTheInnerAndOuterList(); 
    } 

Dies bedeutet, dass Sie diese

public ActionResult ShowAForm() 
{ 
    ViewData["MenuPartialData"] = new MenuModel(); 
    return View(); 
} 

gesetzt Nachdem Sie diesen Schlüssel in Ihrem Controller tun können, können Sie Ihre Masterseite die Überlastung von RenderPartial, wie diese

<% Html.RenderPartial(
    "~/View/Shared/Menu.ascx", 
    (MenuModel)ViewData["MenuPartialData"]); %> 

Diese verwenden geht davon aus, dass Ihr Partial stark in die MenuModel-Klasse eingetippt ist. Dann in dem Teil können Sie das Modell verwenden, das Ihren Code neu geschrieben leicht

<% foreach (MainMenuSort mainMenuSort in Model.OuterList) { %> 
    <li><%= Html.Encode(mainMenuSort.MainMenuId.MainMenuName)%></li> 
    <% foreach (SubMenuSort subMenuSort in Model.InnerList) {%>    
     <%if (mainMenuSort.MainMenuId.Id == subMenuSort.SubMenuId.MainMenu.Id) 
     { %>    
      <li><%= Html.Encode(subMenuSort.SubMenuId.SubMenuName)%></li> 
     <%} %> 
    <%} %>  
    <%}%> 

Hoffnung, die

+0

Vielen Dank. Ich habe gerade ASP.NET MVC gelernt und <% Html.RenderPartial ("~/Views/Shared/Menu.ascx");%> zur Seite site.master hinzugefügt, verstehe aber nicht, was Sie damit meinen: "Sie müssen Legen Sie die Datenschlüssel MainMenuSortListDisplay und SubMenuSortListDisplay in der Aktion fest, die die Ansicht aufruft, die Ihre Masterseite verwendet." – Ros

+0

Sie rufen die Seite mit einer ActionResult-Methode in Ihrer Controller-Klasse auf. Bei dieser Methode müssen Sie die ViewData-Schlüssel setzen zB ViewData [" SubMenuSortListDisplay "] = SomeListVorzugsweise YourModel –

+0

Rufen Sie zurück, wenn Sie immer noch fest stecken :-) –

0

so etwas wie

<% Html.RenderPartial("Menu") %> 

EDIT Versuchen hilft: einem Tippfehler

0

Korrigierte können Sie auch tun Sie es als HTMLHelper und rufen Sie in der MasterPage einfach <% = Html.Menu()%> auf. Dann haben Sie in Ihrem HTMLHelper den Code, um die Datensätze der Datenbank zu erhalten und durch sie zu durchlaufen. Hier ist ein link Ich fand, um dich zu beginnen. Notieren Sie sich meine Kommentare, da im angegebenen Codebeispiel ein Fehler vorliegt. Ich habe immer noch Probleme mit Unterpunkten von Menüs, ich denke, ich brauche eine rekursive Funktion oder etwas?

+0

Danke für das Posten des Links. Ich benutzte eine teilweise Anfrage und folgte http://blog.codeville.net/2008/10/14/partial-requests-in-aspnet-mvc/ – Ros