D'accord, je veux donc afficher une liste contenant des listes de listes de listes ...
Je n'ai aucun moyen de savoir combien de niveaux il y a à afficher, alors je me suis dit que c'est là que j'éclate l'ancienne routine récursive.
J'ai du mal à savoir exactement comment procéder.
Voici ce que j'ai jusqu'à présent (en vue - simplifié):
@foreach(MyObject item in @Model.ListOfObjects){
<div> @item.Title </div>
//Call recursive function?
}
Maintenant, chacun de ces objets a également une liste <MonObjet>. Je veux afficher chaque niveau en dessous de ce div, avec un onglet en retrait par niveau par exemple.
Je pensais qu'une fonction Razor serait la chose à faire ici, mais j'ai besoin d'aide pour la former. 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 clairement besoin d'aide :)
Le moteur de vue Razor permet d'écrire des assistants récursifs en ligne avec le @helper
mot-clé.
@helper ShowTree(IEnumerable<Foo> foos)
{
<ul>
@foreach (var foo in foos)
{
<li>
@foo.Title
@if (foo.Children.Any())
{
@ShowTree(foo.Children)
}
</li>
}
</ul>
}
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();
}
Ensuite, appelez-le comme ceci:
@foreach(MyObject item in @Model.ListOfObjects){
<div> @item.Title </div>
@html.ShowSubItems(item)
}