2014-02-05 4 views
1

Что я хочу сделать, это создать сетку, и когда вы нажмете на нее, откроется сетка деталей для пользователя. Я создал их, как этотKendo Ui Model Binding 3 уровня Объект

@(Html.Kendo().Grid(Model.items).Name("Access") 
.Columns(columns => 
{ 
    columns.Bound("ProjId").Width(220).Title("Project #");  
    })  
    .ClientDetailTemplateId("detailTemplateId") 
    .Selectable() 
    .Events(events => events.DetailInit("initDetailGrid"))           
    .DataSource(dataSource => dataSource 
    .Ajax() 
    .ServerOperation(false)     
) 
) 

<script id="detailTemplateId" type="text/kendo-tmpl"> 

@(Html.Kendo().Grid(Model.items.subItems).Name("detailGrid") 
.Columns(columns => columns.Bound("itemsName").Title("Select")) 
.DataSource(dataSource => dataSource 
         .Ajax() 
         .ServerOperation(false) 
         ) 
.ToClientTemplate() 
) 
</script> 

модель создается как этот

public class ItemModel 
{   
    public List<myItems> items; 

    public ItemModel() 
    {   
     items = new List<myItems>(); 
    } 
} 

класс myItems определяется в другом месте, а внутри класса myItems класс к югу, который подпункты, что я пытаюсь получить

public class myItems 
{ 
    public int ProjId; 
    public List<otherItems> subItems; 

    public myItems(){ 
     subItems = new List<otherItems>(); 
    } 
    public class otherItems() 
    {   
     public String itemsName; 
     public int itemId 
    } 
} 

, но когда я пытаюсь связать его здесь @(Html.Kendo().Grid(Model.items.subItems).Name("detailGrid") говорит, что он не может разрешить символ? Правильно ли я делаю это? или мне нужно привязать его к элементам, а затем получить значения внутри столбцов, используя шаблон столбцов?

ответ

0

В основном при работе с серверными переплете Сетки следует использовать DetailTemplate вместо DetailTemplateID

Вот пример:

@model IEnumerable<Kendo.Mvc.Examples.Models.Product> 

@helper ThirdLevelHelper(Kendo.Mvc.Examples.Models.Product x) 
{ 

     @(Html.Kendo().Grid(Model)  
     .Name("Grid"+Guid.NewGuid()) 
     .Columns(columns => { 
      columns.Bound(p => p.ProductID).Groupable(false); 
      columns.Bound(p => p.ProductName); 
      columns.Bound(p => p.UnitPrice); 
      columns.Bound(p => p.UnitsInStock); 
     }) 
     .Pageable() 
     .Sortable() 
     .Scrollable() 
     .Filterable() 
     .Groupable() 
    ) 
} 

@(Html.Kendo().Grid(Model)  
    .Name("Grid") 
    .Columns(columns => { 
     columns.Bound(p => p.ProductID).Groupable(false); 
     columns.Bound(p => p.ProductName); 
     columns.Bound(p => p.UnitPrice); 
     columns.Bound(p => p.UnitsInStock); 
    }) 
    .DetailTemplate(@<text> 
@(Html.Kendo().Grid(Model)  
    .Name("Grid"+item.ProductID) 
    .Columns(columns => { 
     columns.Bound(p => p.ProductID).Groupable(false); 
     columns.Bound(p => p.ProductName); 
     columns.Bound(p => p.UnitPrice); 
     columns.Bound(p => p.UnitsInStock); 
    }) 
    .DetailTemplate(x=>ThirdLevelHelper(x)) 
    .Pageable() 
    .Sortable() 
    .Scrollable() 
    .Filterable() 
    .Groupable() 
) 
</text>) 
    .Pageable() 
    .Sortable() 
    .Scrollable() 
    .Filterable() 
    .Groupable() 
) 

Nitice, что для 3-го уровня иерархии вы будете должны использовать вспомогательный метод, потому что Razor не разрешает такие операторы nesting @.

Также вы должны найти способ и гарантировать уникальность имени каждого виджета Grid по иерархии. Обычно это делается приложением sufix.

Также рассмотрите, как контекст распространяется до вложенных сеток, передавая текущий элемент, он немного отличается при использовании помощника.