Dynamisches Menü in C# ASP.Net MVC3 Razor
Erklären
Ich versuche ein dynamisches Menü, laden der Elemente aus der Datenbank.
Ich brauche 3 Ebenen max im Menü wie dieses:
<ul>
<li>Home</li>
<li>Peoples
<ul>
<li>Employee
<ul>
<li>Create</li>
<li>List</li>
<li>Edit</li>
</ul>
</li>
<li>Training</li>
<li>Material Requisition</li>
</ul>
</li>
</ul
Nun, das ist, wie ich bin zu tun heute, aber ohne Erfolg:
Dem partial view "TopBar.cshtml" zeigt auf jeder Seite, und es heißt, innerhalb der "_Layout.cshtml" wie folgt:
_Layout.cshtml
<body>
@Html.Partial("TopBar")
<div class="container body-content">
@RenderBody()
(...)
und die "TopBar.cshtml" zeigt die Daten mit dem nachstehenden code
@model IEnumerable<SIGO.Models.TopMenu>
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<div class="SigoLogo" onclick="location.href='@Url.Action("")'">
<a href="@Url.Action("Index", "Home")" title="Início">
<img src="~/Content/images/Wlogo.png" />
</a>
</div>
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"></button>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
@if (Model != null){
foreach(var item in Model.Where(p => p.Nivel == 0)) {
if (Model.Where(s1 => s1.Parent == item.TopMenuID) != null) {
<li>@item.Descricao
<ul>
@foreach (var sub1 in Model.Where(s1 => s1.Parent == item.TopMenuID)) {
if (Model.Where(s2 => s2.Parent == sub1.TopMenuID) != null) {
<li>@sub1.Descricao
<ul>
@foreach (var sub2 in Model.Where(s2 => s2.Parent == sub1.TopMenuID)) {
<li>@Html.ActionLink(sub2.Descricao,sub2.Action,sub2.Controller)</li>
}
</ul>
</li>
}else{
<li>@Html.ActionLink(sub1.Descricao,sub1.Action,sub1.Controller)</li>
}
}
</ul>
</li>
}else{
<li>@Html.ActionLink(item.Descricao,item.Action,item.Controller)</li>
}
}
}
</ul>
</div>
</div>
</div>
Dies ist die "TopMenu" Klasse
public class TopMenuItem {
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; } //Iterator
public int Parent { get; set; } //TopMenuItem parent id
public bool Group { get; set; } //If this have another item below
public string Descricao { get; set; } //Text to show
public string Action { get; set; } //Action to Go
public string Controller { get; set; } //Controller to Go
}
Alle dieses Ergebnis in leere Liste, wie eine saubere Datenbank.
Aber, wenn ich eine Aktionsliste z.B. ein Konflikt tritt auf, da Stand Ansichten ("Liste.cshtml" und "TopBar.cshtml") beginnt mit:
@model IEnumerable<SIGO.Models.Employee>
oder
@model IEnumerable<SIGO.Models.TopMenu>
P. S.: ich benutze keine controller, um die Daten zu TopMenu.
Fragen
- Wie kann ich das TopMenu?
- Haben Sie eine andere Lösung?
Dank! Sorry für eventuelle Fehler in der übersetzung
InformationsquelleAutor Anpix | 2014-07-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das ist die Lösung erreicht, mit der oben genannten Antworten
Dank für alle
Klasse: TopMenu.cs
Kontext: SigoContext.cs
Controller: SigoController.cs
Layout: _Layout.cshtml
Teilansicht: TopMenu.cshtml
Danke Jungs!
InformationsquelleAutor Anpix
Muss man das Modell des partial view. Im Gegenteil, dieser Zustand wird immer falsch sein und es wird nichts gerendert:
So, Sie brauchen sollten zum Rendern der Ansicht wie diese:
In Ihrem Fall, wie dieser code in die layout-Ansicht haben Sie keine Möglichkeit, an die
model
.Ist die einzige vernünftige Möglichkeit dies umzusetzen ist die Schaffung einer Steuerung zu bieten, das Modell. Wenn Sie dies tun, anstatt
Partial
Sie verwenden solltenAction
oderRenderAction
(MSDN docs hier). I. e. implementieren Sie diese wie folgt:MenuController
mit einemMenu
Aktion, gibt einePartialView
was macht das Menü. Erstellen Sie das Modell innerhalb dieser Aktion und verwenden Siereturn Partial("Menu",model)
, wo"Menu"
bezieht sich auf eine"Menu.cshtml"
Ansicht und Modell hat, die erforderlichen Daten, die zum Rendern dieser Ansicht. Diese Aktion wird das Rendern des Menüs.Html.RenderAction("Menu","Menu")
zum Rendern des Menüs im layout. Die ersten"Menu"
parameter bezieht sich auf den Namen der Aktion und die zweite bezieht sich auf den controller.InformationsquelleAutor JotaBe
Erstellen Sie eine separate controller - /action-Methode zum erstellen der Menü und rufen Sie es mit
@Html.Action()
. Zum BeispielDann in Ihrem layout
Punkt 1): Sie tun das im wesentlichen die gleiche Sache. Der Unterschied ist, dass
@Html.RenderAction()
macht das Resultat direkt auf die Antwort (was ist effizienter, wenn die Aktion wieder eine große Menge an HTML) in der Erwägung, dass@Html.Action()
gibt einen string zurück mit dem Ergebnis. Punkt 2): ich verstehe nicht, was Ihre Frage - gibt es ein problem?Es ist nicht ein problem. Ich sage nur, wie ich erreicht haben, die Lösung mit eurer Hilfe.
InformationsquelleAutor
Können Sie versuchen, wie dieser.
Ich verwende diese und Sie funktioniert.
ANZEIGEN-CODE
Controller-code
Model-Klasse
InformationsquelleAutor Pawan Lakhara