2012-06-27 20 views
7

ich eine rekursive Modell wie dieses:Erstellen Sie ein Formular aus einem rekursiven Modell

public class Node 
{ 
    public int Id { get; set; } 
    public string Text { get; set; } 
    public IList<Node> Childs { get; set; } 

    public Node() 
    { 
     Childs = new List<Node>(); 
    } 
} 

Ich baue einen Baum mit ihm, indem Sie diesen Code ein Rasiermesser Ansicht withing:

<ul> 
    @DisplayNode(Model) 
</ul> 

@helper DisplayNode(Node node) { 
    <li> 
     @node.Text 

     @if(node.Childs.Any()) 
     { 
      <ul> 
       @foreach(var child in node.Childs) 
       { 
        @DisplayNode(child) 
       } 
      </ul> 
     } 
    </li> 
} 

alles funktioniert Gut, mein Baum rendert, aber ich muss ein Textfeld in jeder Zeile des Baumes hinzufügen und ich möchte Namen wie folgt eingeben müssen:

Childs[0].Childs[1].Childs[2].Text 

So funktioniert meine Modellbindung wie erwartet.

Gibt es eine Möglichkeit, EditorTemplates oder etwas anderes zu verwenden, um dies zu erreichen?

Ich möchte vermeiden, Eingabe-Namen in Javascript auf dem Formular zu erstellen.

+0

haben Sie versucht, Vorlagen zu verwenden? –

Antwort

6

Sie könnten Editorvorlagen verwenden, die den aktuellen Navigationskontext anstelle von @helper berücksichtigen.

So eine benutzerdefinierte Editor-Vorlage für den Node Typen (~/Views/Shared/EditorTemplates/Node.cshtml) definieren:

@model Node 
<li> 
    @Html.LabelFor(x => x.Text) 
    @Html.EditorFor(x => x.Text) 
    @if (Model.Childs.Any()) 
    { 
     <ul> 
      @Html.EditorFor(x => x.Childs) 
     </ul> 
    } 
</li> 

und dann in einiger Hauptansicht:

@model MyViewModel 
<ul> 
    @Html.EditorFor(x => x.Menu) 
</ul> 

wo die Menu Eigenschaft offensichtlich vom Typ Node.

+0

Es funktioniert A1! Danke für die Hilfe! –

+0

@Darin wie können wir dynamisch Knoten in dieser Struktur hinzufügen? so dass, wenn wir Formulardaten auf dem Server Standardmodell Bindemittel Kartendaten an der richtigen Stelle – gaurav

+0

Post ich hatte das gleiche Problem: ein rekursives Objekt gab mir eine "Stack Empty" Ausnahme in der EditorTemplate. Ich habe dann das Beispiel in dieser Frage mit diesem exakten 'Node' Code und Ihrer vorgeschlagenen EditorTemplate ausprobiert. Es funktioniert immer noch nicht für mich. Ich bekomme die gleiche "Stack Empty" Ausnahme. – davidXYZ

Verwandte Themen