2012-06-27 13 views
7

Tengo un modelo recursivo de esta manera:Crear un formulario de un modelo recursivo

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

Estoy construyendo un árbol con él withing una vista de afeitar utilizando este código:

<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> 
} 

todo funciona bien, mi árbol representa, pero necesito agregar un cuadro de texto en cada fila del árbol y quiero tener que ingresar nombres como este:

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

Entonces mi encuadernación de modelo funcionará como se espera.

¿Hay alguna forma de usar EditorTemplates o cualquier otra cosa para lograr esto?

Quiero evitar crear nombres de entrada en javascript en el formulario enviado.

+0

¿Intentó usar plantillas? –

Respuesta

6

Se puede usar el Editor de plantillas que respeten el contexto de navegación actual en lugar de tales @helper.

Así definen un editor de plantillas a medida para el tipo Node (~/Views/Shared/EditorTemplates/Node.cshtml):

@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> 

y luego dentro de alguna vista principal:

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

donde la propiedad Menu es obviamente de tipo Node.

+0

¡Funciona A1! ¡Gracias por la ayuda! –

+0

@Darin ¿cómo podemos agregar nodo dinámicamente en esta estructura? de modo que cuando publicamos datos de formulario en los datos del mapa del vinculador del modelo predeterminado del servidor en su lugar correcto – gaurav

+0

tuve el mismo problema: un objeto recursivo me estaba dando una excepción de "Stack Empty" en EditorTemplate. Luego probé el ejemplo en esta pregunta con este código 'Node' exacto y su EditorTemplate sugerido. Todavía no funciona para mí. Obtengo la misma excepción de "Stack Empty". – davidXYZ

Cuestiones relacionadas