2012-06-27 42 views
7

Tôi có một mô hình đệ quy như thế này:Tạo một biểu mẫu từ mô hình đệ quy

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

Tôi đang xây dựng một cây với nó withing một cái nhìn dao cạo bằng cách sử dụng mã này:

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

công trình Tất cả mọi thứ tốt, cây của tôi ám, nhưng tôi cần phải thêm một hộp văn bản trên mỗi hàng của cây và tôi muốn phải nhập tên như thế này:

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

Vì vậy, mô hình ràng buộc của tôi sẽ làm việc như mong đợi.

Có cách nào bằng cách sử dụng EditorTemplates hoặc bất kỳ thứ gì khác để đạt được điều này không?

Tôi muốn tránh tạo tên đầu vào trong javascript khi gửi biểu mẫu.

+0

bạn đã cố sử dụng mẫu chưa? –

Trả lời

6

Bạn có thể sử dụng các mẫu trình chỉnh sửa tôn trọng ngữ cảnh điều hướng hiện tại thay vì @helper.

Vì vậy, xác định một mẫu biên tập tùy chỉnh cho Node loại (~/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> 

và sau đó bên trong một số giao diện chính:

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

nơi Menu tài sản rõ ràng là kiểu Node.

+0

Nó hoạt động A1! Cảm ơn đã giúp đỡ! –

+0

@Darin cách chúng tôi có thể thêm nút động trong cấu trúc này? để khi chúng tôi gửi dữ liệu biểu mẫu tới máy chủ mô hình dữ liệu bản đồ mặc định ở đúng vị trí của nó – gaurav

+0

Tôi đã có cùng một vấn đề: một đối tượng đệ quy đã cho tôi một ngoại lệ "Stack Empty" trong EditorTemplate. Sau đó tôi đã thử ví dụ trong câu hỏi này với mã 'Node' chính xác và EditorTemplate được đề xuất của bạn. Nó vẫn không hiệu quả với tôi. Tôi nhận được cùng một ngoại lệ "Stack Empty". – davidXYZ

Các vấn đề liên quan