2014-02-05 71 views
1

我想要做的是创建一个网格,当你点击它打开一个细节网格供用户选择。我创造了他们这样Kendo Ui模型绑定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,对于层级的第三级,你会必须使用助手方法,因为Razor不允许嵌套@操作符。

您还必须找到一种方法并确保每个网格控件在层次结构中的名称都是唯一的。这通常通过启动sufix来完成。

另外仔细看一下,看看上下文是如何传播到嵌套的网格,通过传递当前项目,使用助手时略有不同。