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
Vous devez vous connecter pour publier un commentaire.
homme, vous avez obtenu quelques wonk qui se passe ici. je ressens votre douleur sur collée.
voir si cette flotte votre bateau.
vous avez besoin d'une valeur de semences de garder une trace de ce que vous cherchez dans la liste lorsque vous ne la récursivité sur la même liste. il est mieux de le faire d'un parent, les enfants de la cartographie dans la classe, mais meh c'était amusant de le faire, compte tenu de votre structure et de devrait faire l'affaire.
Modèles
Contrôleur (NOTE: vous commencez la récursivité de la chaîne par le réglage de la Graine de la propriété à la valeur null qui va ramasser tous les null parents)
Vues
L'indice de
Partielle (votre _TreeCategories. REMARQUE: définir la valeur initiale du courant ID de nœud et est volia récursivité)
c'est la façon dont il est la plupart du temps, un plaisir de vous aider
Par ailleurs, ce type de parent-enfants cartographie recommandez-vous? J'ai choisi ce "ID - ParentID" méthode parce que c'est une façon de mettre en œuvre hiérarchique de la structure des données dans un modèle de données relationnel, comme une base de données. Dans les Catégories table ID est la clé primaire, ParentID est une clé étrangère qui fait référence à des Catégories.ID .
cela fonctionne bien. cela dépend si vous voulez bidirectionnel de navigation, si oui, alors les enfants ont besoin d'un parent de référence. 'Normal' scénario est le suivant: classe de Papa (hérite d'une classe appelée Personne) a une propriété des Enfants, qui est une liste de Personne. Personne ne dispose pas d'un Parent (ou les Parents) propriété. Cela vous maintient clair de références circulaires, mais dans le Cadre de l'Entité, vous pouvez le faire à cause de lazy loading. Donc l'autre sens (qui est bidirectionnel) est Papa qui a des Enfants biens et la Personne a un Parent(ou les Parents) propriété.
OriginalL'auteur hubson bropa
Vous pouvez essayer de Bouclier de l'INTERFACE utilisateur de récursive TreeView pour ASP.NET MVC.
Il permet de spécifier l'ensemble de l'Arborescence des éléments à l'aide d'un RecursiveDataSource objet, qui peut être configuré pour récupérer les données pour un élément de l'arbre à partir d'un point de terminaison distant ou une source locale "paresseusement", à chaque fois que l'élément est en cours d'expansion.
La RecursiveDataSource est un wrapper autour d'un JavaScript DS widget, ce qui entraîne un besoin de code JS, ainsi que la mise à jour de votre serveur de code qui permettra de fournir des données (mise en œuvre d'un service web, ou de placer les données dans une variable JS dans votre point de vue).
Mise à jour de la réponse
OriginalL'auteur Vladimir Georgiev