2012-06-27 3 views
7

У меня есть рекурсивная модель, как это:Создание формы из рекурсивной модели

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

Я строй дерева с ним жгутами вида бритвы, используя этот код:

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

все работает отлично, мое дерево отображает, но мне нужно добавить текстовое поле на каждую строку дерева, и мне нужно ввести такие имена:

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

Так что моя привязка к модели будет работать так, как ожидалось.

Есть ли какой-либо способ с помощью EditorTemplates или что-то еще для этого?

Я хочу избежать ввода имен ввода в javascript на форме submit.

+0

Вы пытались использовать шаблоны? –

ответ

6

Вы можете использовать шаблоны редактора, которые уважают текущий навигационный контекст, а не такой @helper.

Так определить пользовательский шаблон редактора для 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> 

, а затем в какой-то главном экране:

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

где Menu свойство, очевидно, типа Node.

+0

Работает A1! Спасибо за помощь! –

+0

@Darin Как мы можем динамически добавлять узел в эту структуру? так что, когда мы отправляем данные формы на карту по умолчанию, сопоставляем данные карты привязки в нужном месте – gaurav

+0

У меня была такая же проблема: рекурсивный объект давал мне исключение «Stack Empty» в EditorTemplate. Затем я попробовал пример в этом вопросе с помощью этого точного кода «Node» и вашего предложенного EditorTemplate. Это все еще не работает для меня. Я получаю исключение «Stack Empty». – davidXYZ

Смежные вопросы