Ho una vista parziale in un progetto MVC 4, che è fortemente digitato. Prende una collezione IEnumerable di una tabella di un database. In quella tabella ci sono ID, Nomi e ParentID per memorizzare la connessione gerarchica tra i record. Il punto di vista che chiama la vista parziale è anche fortemente tipizzato, ci vuole l'intero database come il modello, e passa la tabella Categorie per la vista parziale, come una raccolta enumerabile:ASP.NET MVC 4 che genera una vista ad albero con vista parziale ricorsiva
@Html.Partial("_TreeCategories", @Model.Categories.ToList())
E in vista parziale, I voglio prima prendere i nodi radice, così posso estendere l'intero albero in modo ricorsivo. Nella tabella del database, tutti i record sono considerati come nodi radice con un ParentID == null.
Quindi in generale, il mio modo di fare questo sarà simile:
@model IEnumerable<TreeCollections.OpenAccess.Category>
@if (Model.ToList().Count >= 0)
{
@if (Model.ToList()[0].Parent_id == null)
{
<text><ul id="navigation"></text>
}
@foreach (var node in @Model)
{
<li><a href="[email protected]">@node.Name</a>
@foreach (var subNode in @Model.Where(s => s.Parent_id == node.Id))
{
@Html.Partial("_TreeCategories", subNode)
}
</li>
}
@if (Model.ToList()[0].Parent_id == null)
{
</ul>
}
}
Così ho verificare se ParentID del primo elemento del modello è nullo, e se lo è, allora dovrebbe creare un < ul> tag con l'id "navigazione", quindi il plugin jquery può riconoscere che è pensato per essere un controllo ad albero. Quindi crea un tag lista con una chiamata ricorsiva all'interno. La vista parziale chiamata in modo ricorsivo prende i figli del nodo come modello. Infine, se siamo arrivati alla fine del rendering della vista parziale, e siamo al "livello radice", dovremmo scrivere un tag 01>
Ci sono alcuni problemi, tuttavia. Innanzitutto, alla fine, quel tag di elenco non ordinato di chiusura è sbagliato, VS non riesce a trovare il tag di inizio corrispondente per quello. In secondo luogo, non so perché, ma nella parte superiore, posso inserire l'avviatore < tra tag e non posso farlo nel tag di chiusura di seguito. Ma non sono nemmeno sicuro di questi tag < ul, anche quelli mi sembrano sbagliati.
Per favore, aiutami, sono bloccato con questo per giorni ora.
Grazie, è così chiaro, eppure, ero confuso per giorni ... Ho appena reinstallato l'intero sistema sul mio computer, ci vuole del tempo prima di scaricare e installare nuovamente Visual Studio per provare questo fuori, ma almeno vedo lo schema ora! Grazie mille! – user2082422
è così che è il più delle volte, felice di aiutare –
A proposito, che tipo di mappatura genitori-figli mi consigliate? Ho scelto questo metodo "ID - ParentID" perché questo è un modo per implementare la struttura gerarchica dei dati in una datamodel relazionale, come un database. Nell'ID della tabella Categorie è la chiave primaria, ParentID è una chiave esterna che fa riferimento a Categories.ID. – user2082422