ASP.NET MVC 4 de la génération d'un treeview avec vue partielle récursive

J'ai une vue partielle dans un MVC 4 du projet, qui est fortement typé. Il prend un IEnumerable collection d'une table d'une base de données. Dans cette table, il y a des Id, Noms, et ParentIDs pour le stockage hiérarchique de connexion entre les enregistrements. Le point de vue qui appelle la vue partielle, est également fortement typé, il prend l'ensemble de la base de données que le modèle, et passe les Catégories table à la vue partielle, comme une énumération collection:

@Html.Partial("_TreeCategories", @Model.Categories.ToList())

Et dans la vue partielle, je veux prendre les nœuds racine première, donc je peux l'étendre à l'ensemble de l'arbre de manière récursive. Dans la table de base de données, tous les enregistrements sont considérés comme des nœuds racine avec un ParentID == null.

Donc, en général, de ma façon de faire cela devrait ressembler à:

@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>
    }
}

J'ai donc vérifier si le premier élément est ParentID du Modèle est null, et si elle l'est, elle doit créer un < ul> tag avec l'id "navigation", de sorte que le plugin jquery peut reconnaître qu'il est destiné à être un contrôle treeview. Il crée ensuite une liste de balise avec un appel récursif à l'intérieur. L'appelée récursivement vue partielle prend les enfants du nœud dans le modèle. Et enfin, si nous sommes arrivés à la fin de la vue partielle du rendu, et nous sommes à la "racine", il faut écrire une fermeture < ul> tag

Il y a quelques problèmes, cependant. Tout d'abord, à la fin, que la fermeture de liste non ordonnée de la balise est mal, VS ne pouvez pas trouver la correspondance balise de début. Deuxièmement, je ne sais pas pourquoi, mais au sommet, je peux mettre le starter < ul> tag dans entre les balises, et je ne peux pas le faire à la balise de fermeture ci-dessous. Mais je ne suis pas sûr au sujet de ces < ul > balises, je sens que ceux qui sont mauvais aussi.

S'il vous plaît, aidez-moi, je suis coincé avec ce pour jours maintenant.

OriginalL'auteur user2082422 | 2013-07-09