83 votes

Fonction récursive de MVC3 Razor

Ok, donc je veux afficher une liste contenant des listes de listes de listes...

Je n'ai aucun moyen de savoir combien de niveaux il y a à l'écran, alors j'ai pensé que c'est là que je me casse la vieille routine récursive.

J'ai de la difficulté avec exactement comment aller à ce sujet.

c'est ce que j'ai à ce jour (en vue simplifiée):

@foreach(MyObject item in @Model.ListOfObjects){ 
    <div> @item.Title </div>
    //Call recursive function?
}

Maintenant, chacun de ces objets ont aussi une Liste. Je veux afficher chaque niveau en dessous de ce div, avec un onglet retrait par niveau, par exemple.

Je pensais à un rasoir fonction serait la chose à faire ici, mais j'ai besoin d'aide dans la formation. Voici ma pensée:

@functions{
    public static void ShowSubItems(MyObject _object){
         if(_object.ListOfObjects.Count>0){
             foreach(MyObject subItem in _object.listOfObjects){
                 //Show subItem in html
                 ShowSubItems(subItem);
             }
         }
     }
 }

Mais comme vous pouvez le voir, j'ai simplement besoin d'un peu d'aide :)

217voto

Paolo Moretti Points 9519

Le moteur de vue Razor permet d’écrire des helpers récursifs en ligne avec le mot clé @helper .

 @helper ShowTree(IEnumerable<Foo> foos)
{
    <ul>
        @foreach (var foo in foos)
        {
            <li>
                @foo.Title
                @if (foo.Children.Any())
                {
                    @ShowTree(foo.Children)
                }
            </li>
        }
    </ul>
}
 

13voto

Edwin de Koning Points 7955

Je pense qu'il est préférable de créer un assistant HTML pour cela. Quelque chose comme ça:

 public static string ShowSubItems(this HtmlHelper helper, MyObject _object)
{
     StringBuilder output = new StringBuilder();
     if(_object.ListOfObjects.Count > 0)
     {
         output.Append("<ul>");

         foreach(MyObject subItem in _object.listOfObjects)
         {
             output.Append("<li>");
             output.Append(_object.Title);
             output.Append(html.ShowSubItems(subItem.listOfObjects);
             output.Append("</li>")
         }
         output.Append("</ul>");
     }
     return output.ToString();
}
 

Puis appelle ça comme ça:

 @foreach(MyObject item in @Model.ListOfObjects){ 
    <div> @item.Title </div>
    @html.ShowSubItems(item)
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X