Rekursive ASP.NET MVC 3 Razor-Funktion

76

Okay, ich möchte eine Liste mit Listen von Listen von Listen anzeigen ...

Ich habe keine Möglichkeit zu wissen, wie viele Ebenen angezeigt werden sollen, also dachte ich, hier breche ich die alte rekursive Routine aus.

Ich habe jedoch Probleme damit, wie ich genau vorgehen soll.

Folgendes habe ich bisher (im Blick - vereinfacht):

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

Jetzt hat jedes dieser Objekte auch eine Liste <MyObject>. Ich möchte jede Ebene unterhalb dieses Bereichs anzeigen, beispielsweise mit einem Tabulatoreinzug pro Ebene.

Ich dachte, eine Rasiermesserfunktion wäre hier das Richtige, aber ich brauche Hilfe bei der Gestaltung. Hier ist mein Denken:

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

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

Aber wie Sie sehen, brauche ich einfach Hilfe :)

Dynde
quelle

Antworten:

204

Mit der Razor View Engine können rekursive Inline-Helfer mit dem @helperSchlüsselwort geschrieben werden.

@helper ShowTree(IEnumerable<Foo> foos)
{
    <ul>
        @foreach (var foo in foos)
        {
            <li>
                @foo.Title
                @if (foo.Children.Any())
                {
                    @ShowTree(foo.Children)
                }
            </li>
        }
    </ul>
}
Paolo Moretti
quelle
5
Eine Sache bleibt, dass es von @ShowTree (Foos)
angezeigt werden
1
Das funktioniert wirklich gut. Es kann auch sinnvoll sein, stackoverflow.com/questions/12943245/… für die Referenzierung lokaler Variablen auf der cshtml-Seite zu erwähnen .
Travis J
Wie kann dieser Code in asp.net Core 2 implementiert werden? in asp.net Kern 2 gibt es keinen @helper
sagte Roohullah Allem
2
@Jahan Sieht so aus, als wären @helpers in ASP.NET Core verschwunden. Inline-Funktionen sind eine mögliche Alternative: github.com/aspnet/Razor/issues/715#issuecomment-272890766 , sehen aber viel weniger lesbar aus!
Paolo Moretti
@PaoloMoretti Wie kann ich es tun, wenn ich es als rekursiven Func definiere? Ich möchte verschachtelte Kommentare mit rekursivem Func erstellen. Dieser Fehler wird in der VS2018-IDE angezeigt: "Die Verwendung der nicht zugewiesenen lokalen Variablen 'FunctionName', der lokalen Variablen 'FunctionName', wird möglicherweise vor dem Zugriff nicht initialisiert"
sagte Roohullah Allem am
13

Ich denke, es ist am besten, einen HTML-Helfer dafür zu erstellen. Etwas wie das:

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

Dann nenne es so:

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