2011-06-21 30 views
67

bien, así que quieren mostrar una lista que contiene las listas de listas de listas ...ASP.NET MVC 3 Razor función recursiva

que no tienen forma de saber cuántos niveles hay que mostrar, por lo que pensé aquí es donde exploto la vieja rutina recursiva.

Tengo problemas con exactamente cómo hacerlo.

Esto es lo que tengo hasta ahora (en la vista - simplificado):

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

Ahora cada uno de estos objetos también tienen un MiObjeto Lista <>. Quiero mostrar cada nivel debajo de este div, con una sangría de pestaña por nivel, por ejemplo.

Estaba pensando que una función Razor sería lo que hay que hacer aquí, pero necesito ayuda para formarla. Aquí está mi pensamiento:

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

       // Show subItem in HTML 
       ShowSubItems(subItem); 
      } 
     } 
    } 
} 

Pero como se puede ver, claramente necesito un poco de ayuda :)

Respuesta

179

la navaja vista motor permite escribir ayudantes en línea recursivos con la palabra clave @helper.

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

¡eso es hermoso gracias! No es que haya algo malo con la otra respuesta, pero esa es de hecho una forma mucho más agradable de hacerlo. – Dynde

+3

queda una cosa que debe llamar a la vista por ** @ ShowTree (Foos) ** – vicky

+1

Esto funciona realmente bien. También puede tener sentido mencionar http://stackoverflow.com/questions/12943245/access-global-page-variable-in-helper para hacer referencia a variables locales en la página cshtml. –

12

creo que lo mejor es crear un asistente de HTML para esto. Algo como esto:

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(); 
} 

Entonces lo llaman así:

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