在显示多个网格时处理元素Id冲突

时间:2015-10-01 17:08:10

标签: kendo-ui kendo-grid kendo-asp.net-mvc

所以,我正在一个需要显示2个Kendo网格的页面上工作。网格基于相同的模型,具有相同的模式等。唯一的区别是其中一个模型属性(以及关联的网格名称和CRUD调用)的值。例如:

<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。显然,这并不理想。例如,如果(我现在处理的是什么)我想为Department附加一个下拉列表编辑器,

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

kendo将查看DropDownList中的.Name(),并将模板附加到它带有正确id的第一个元素。因此,第一个网格创建其编辑器(两次),而第二个网格仍然是标准文本框输入。

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

1 个答案:

答案 0 :(得分:0)

如果您希望将列显示为网格内的下拉列表,则通常会使用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.