2015-10-01 104 views
1

因此,我正在处理需要显示2个Kendo网格的页面。网格基于相同的模型,具有相同的模式等。唯一的区别是一个模型属性的值(以及关联的网格名称和CRUD调用)。例如:当处理多个网格时处理元素ID冲突

<div> 
@(Html.Kendo().Grid<Person>() 
      .Name("Sales") 
      .Columns(columns => 
      { 
       columns.Bound(c => c.FullName); 
       columns.Bound(c => c.Department); 
       columns.Command(command => 
       { 
        command.Edit(); 
        command.Destroy(); 
       }); 
      }) 
      .ToolBar(toolbar => toolbar.Create()) 
      .Editable(editable => editable.Mode(GridEditMode.InLine)) 
      .Sortable() 
      .DataSource(datasource => datasource 
       .Ajax() 
       .ServerOperation(false) 
       .Model(model => model.Id(u => u.PersonID)) 
       .Create(update => update.Action("Person_Create", "Admin", new { positionTypeId = 1 })) 
       .Read(read => read.Action("Person_Read", "Admin")) 
       .Update(update => update.Action("Person_Update", "Admin")) 
       .Destroy(update => update.Action("Person_Destroy", "Admin")) 
      )) 
</div> 
<div> 
      @(Html.Kendo().Grid<Person>() 
      .Name("IT") 
      .Columns(columns => 
      { 
       columns.Bound(c => c.FullName); 
       columns.Bound(c => c.Department); 
       columns.Command(command => 
       { 
        command.Edit(); 
        command.Destroy(); 
       }); 
      }) 
      .ToolBar(toolbar => toolbar.Create()) 
      .Editable(editable => editable.Mode(GridEditMode.InLine)) 
      .Sortable() 
      .DataSource(datasource => datasource 
       .Ajax() 
       .ServerOperation(false) 
       .Model(model => model.Id(u => u.PersonID)) 
       .Create(update => update.Action("Person_Create", "Admin", new { positionTypeId = 2 })) 
       .Read(read => read.Action("Person_Read", "Admin")) 
       .Update(update => update.Action("Person_Update", "Admin")) 
       .Destroy(update => update.Action("Person_Destroy", "Admin")) 
      )) 
</div> 

在机型将

public class Person 
{ 
    public int PersonID { get; set; } 
    public string Department{ get; set; } 
    public int PositionTypeId { get; set; } 
    public string FullName { get; set; } 
} 

因此,每个网格都有一个唯一的ID,但许多网格内的元素将具有相同的ID。显然,这并不理想。例如如果我要附加的系下拉列表编辑器(我处理现在是什么),

@(Html.Kendo().DropDownList() 
    .Name("Department") 
    .BindTo((System.Collections.IEnumerable)ViewData["Department"]) 
) 

剑道将着眼于在DropDownList的,请将.Name(),和模板安装到第一元素它来与正确的ID。所以,第一个网格创建了它的编辑器(两次),而第二个网格仍然是标准的文本框输入。

所以我想知道是否有办法来避免这个问题(最好不用重新编码js中的网格)。

+0

你能重新编写与JS而不是你的下拉列表? – Mark

+0

想了一会儿,但我无法让它工作。 Kendo在编译时将剃须刀语法变成了js(除非我错了),所以我不能在函数中引用js函数或对象来附加模板。在运行时附加也很困难,因为没有“添加编辑器到列”的功能 - 有必要直接修改网格的js变量和html。 – bchilders

+0

虽然如果我错了,请纠正我。 – bchilders

回答

1

如果你想有一个列显示的下拉列表中选择一个网格内,你通常会使用ForeignKey列定义,而不是Bound

@(Html.Kendo().Grid<Person>() 
      .Name("Sales") 
      .Columns(columns => 
      { 
       columns.Bound(c => c.FullName); 
       columns.ForeignKey(c => c.Department, (System.Collections.IEnumerable)ViewData["Department"], "NameOfValueColumn", "NameOfDisplayTextColumn"); 
       columns.Command(command => 
       { 
        command.Edit(); 
        command.Destroy(); 
       }); 
      }) 

你必须确保你有EditorTemplates,特别是GridForeignKey在你的项目也是。

EditorTemplates

See a demo of this on the Telerik site.

+0

这确实解决了我的问题 - 谢谢! – bchilders

+0

我有同样的问题,但我没有使用asp.net mvc,我使用html5和js,有关它的任何解决方案?这是我的线程:http://stackoverflow.com/questions/39323180/how-to-set-up-popup-positions-anchor-for-element-in-kendo-column-template?noredirect=1#comment65978687_39323180 – Allen4Tech