2017-10-13 8 views
0

Voici comment ma structure est configurée: J'ai beaucoup de Services (DocType) qui contiennent des Documents enfants (DocType). Le document DocType peut avoir d'autres éléments de document en tant qu'enfants.Obtention récursive d'enfants pour une génération treeview dans un modèle

De cette façon, il est possible pour les éditeurs de créer ce genre d'arbre: service> Document> Document> Document> Document

Documentation center structure

Il n'y a pas de limites à la quantité de niveaux, cela peut durer . J'essaye de trouver un moyen de boucler récursivement chaque document et leurs descendants, mais ils doivent être imbriqués l'un dans l'autre. C'est là que j'ai des problèmes.

Je n'arrive pas à trouver un moyen simple de boucler récursivement chaque niveau par enfant pour générer le contenu.

Voici ce que j'ai jusqu'à présent:

@{ var selection = Model.Children.Where("Visible"); 
    if (selection.Any()) { 
     <ul> 
      @foreach (var item in selection) { 
      <li> 
       <div class="ServiceDocCenterDocumentation"> 
        <h4><a href="#" id="[email protected]" class="DocCenterDocumentationTitle">@item.Name</a></h4> 
        <div class="DocCenterDocumentationDescription">@item.GetPropertyValue("bodyText")</div> 
       </div> 
       <div> 
        @foreach (var children in item.Descendants()){ 
         @* This is the part I'm struggling with for the last few days *@ 

         var actualChildren = children; 
         <h5><a href="#" id="[email protected]" class="DocCenterDocumentationTitle">@children.Name</a></h5> 
         <div class="DocCenterDocumentationDescription">@children.GetPropertyValue("bodyText")</div> 
        } 
       </div> 
      </li> 
      } 
     </ul> 

    } 
    } 

Voici ce que je voudrais réaliser (récursive, non manuellement):

<div class="myService"> 
    <div class="Documents"> 
     <div class="[email protected]"> 
      @elem.bodyText 
      foreach (var child in elem.Children){ 
       <div class="[email protected]"> 
        @child.bodyText 
        foreach (var grandchild in child.Children){ 
         @* It goes on and on for the amount of levels available *@ 
        } 
       </div> 
      } 
     </div> 
    </div> 
</div> 

Je ne suis toujours pas très couramment rasoir, et je me demande s'il y a un moyen de réaliser ce que je voudrais accomplir.

Répondre

1

Vous devez utiliser des aides Razor pour créer votre fonction récursive. En dehors de cela, vous ne devriez pas utiliser Descendants dans chaque enfant car cela retournerait tous les nœuds en dessous de celui-ci. Vous avez juste besoin de ses enfants, puis des enfants de chaque enfant et ainsi de suite. Ainsi, vous passerez chaque liste d'enfants à la fonction pour l'afficher.

@{ var selection = Model.Children.Where("Visible"); 
    if (selection.Any()) { 
     <section class="DocCenter"> 
      @foreach (var item in selection) { 
       <section class="Service"> 
        <div class="ServiceDocCenterDocumentation"> 
         <h1><a href="#" id="[email protected]" class="DocCenterDocumentationTitle">@item.Name</a></h1> 
         <div class="DocCenterDocumentationDescription">@item.GetPropertyValue("bodyText")</div> 
        </div> 

        @DisplayChildren(item.Children().Where("Visible")) 

       </section> 
      } 
     </section> 

    } 
} 

@helper DisplayChildren(IEnumerable<IPublishedContent> children){ 
    if(children.Any()){ 
     <section class="children"> 
      foreach(var child in children){ 
       <section class="[email protected]"> 
        <div class="DocumentDetails"> 
         <h1><a href="#" id="[email protected]" class="DocCenterDocumentationTitle">@children.Name</a></h1> 
         <div class="DocCenterDocumentationDescription">@children.GetPropertyValue("bodyText")</div> 
        </div> 
        //Recursive call here 
        @DisplayChildren(child.Children().Where("Visible")) 
       </section> 
      } 
     </section> 
    } 
} 

D'autre part, bien que ne soit pas liée à la question récurrente, je voudrais utiliser l'élément <section> pour séparer les parents et les enfants, de cette façon, vous pouvez également utiliser h1 pour toutes les rubriques qu'ils sont créés dans un hiérarchie de section: Using HTML sections and outlines

+0

Je ne pouvais pas demander une meilleure réponse. Je vais regarder dans les aides, il devrait optimiser à peu près tout mon projet. Je vais aussi examiner plus en détail les fonctions de l'élément 'section' (et d'autres éléments de structure HTML5). Il y a une prime de 100 rep pour cette réponse dans 23 heures (quand il est possible de l'assigner). Je vous remercie ! –

+0

Heureux d'aider :) –