Telerik 为什么“data”(“kendoGrid”)没有定义?

Telerik 为什么“data”(“kendoGrid”)没有定义?,telerik,kendo-ui,kendo-grid,Telerik,Kendo Ui,Kendo Grid,我有两个剑道网格定义,在局部视图中,除了局部视图模型和网格项模型外,它们完全相同。其中只有一个在代码行上显示JavaScript控制台错误“无法读取未定义的”的属性“dataSource”: $("#index-grid").data("kendoGrid").dataSource.bind("change", function (e) {...}) 另一个没有。未定义的不是dataSource,而是$(“#索引网格”).data(“kendoGrid”)。然而,在另一个相同的网格中,我没有得

我有两个剑道网格定义,在局部视图中,除了局部视图模型和网格项模型外,它们完全相同。其中只有一个在代码行上显示JavaScript控制台错误“无法读取未定义的”的属性“dataSource”:

$("#index-grid").data("kendoGrid").dataSource.bind("change", function (e) {...})
另一个没有。未定义的不是
dataSource
,而是
$(“#索引网格”).data(“kendoGrid”)
。然而,在另一个相同的网格中,我没有得到这个错误。提供给数据源的数据可能会使网格本身失效吗?网格定义如下所示:

@model TerminalIndexModel
@using Kendo.Mvc.UI
@using ParkPay.Helm.ViewModels
@(Html.Kendo().Grid<TerminalIndexItem>()
                .Name("index-grid")
                .Columns(columns =>
                            {
                                columns.Bound(p => p.Name);
                                columns.Template(@<text></text>).ClientTemplate("<input type='checkbox' #= IsActive ? checked='checked':'' # class='chkbx' />").Title("Active").Width(70);
                                columns.Bound(p => p.Remarks);
                                columns.Command(cmd => cmd.Destroy()).Width(80);
                            })
                .ToolBar(toolbar =>
                {
                    toolbar.Create();
                    toolbar.Save();
                })   
                .HtmlAttributes(new { style = "height: 480px;"})                                                        
                .Editable(editable => editable.Mode(GridEditMode.InCell))
                .Filterable()
                .Pageable()
                .Scrollable()
                .Sortable()
                .Resizable(resize => resize.Columns(true))
                .Reorderable(reorder => reorder.Columns(true))
                .DataSource(dataSource => dataSource
                                        .Ajax()
                                        .ServerOperation(false)
                                        .Batch(true)
                                        .PageSize(20)
                                        .Events(events => events.Error("kendoGridErrorHandler"))
                                        .Model(model => model.Id(p => p.Id))
                                        .Read(read => read.Action("Read", "Terminal"))
                                        .Update(update => update.Action("BatchUpdate", "Terminal"))
                                        .Create(create => create.Action("BatchCreate", "Terminal"))
                                        .Destroy(destroy => destroy.Action("BatchDelete", "Terminal"))
                            )
)
@model TerminalIndexModel
@使用Kendo.Mvc.UI
@使用ParkPay.Helm.ViewModels
@(Html.Kendo().Grid())
.Name(“索引网格”)
.列(列=>
{
columns.Bound(p=>p.Name);
columns.Template(@).ClientTemplate(“”).Title(“Active”).Width(70);
columns.Bound(p=>p.comments);
Command(cmd=>cmd.Destroy()).Width(80);
})
.ToolBar(ToolBar=>
{
toolbar.Create();
toolbar.Save();
})   
.HtmlAttributes(新的{style=“height:480px;”})
.Editable(Editable=>Editable.Mode(GridEditMode.InCell))
.可过滤()
.Pageable()
.Scrollable()
.Sortable()
.resize可调整大小(resize=>resize.Columns(true))
.Reorderable(reorder=>reorder.Columns(true))
.DataSource(DataSource=>DataSource
.Ajax()
.ServerOperation(错误)
.Batch(真)
.页面大小(20)
.Events(Events=>Events.Error(“kendoGridErrorHandler”))
.Model(Model=>Model.Id(p=>p.Id))
.Read(Read=>Read.Action(“Read”,“Terminal”))
.Update(Update=>Update.Action(“批更新”、“终端”))
.Create(Create=>Create.Action(“BatchCreate”、“Terminal”))
.Destroy(Destroy=>Destroy.Action(“BatchDelete”、“Terminal”))
)
)
唯一的区别是
TerminalIndexItem
LocationIndexItem'和
TerminalIndexModel
LocationIndexModel
,当然还有CRUD定义中的控制器名称,
Terminal
Location`。我无计可施地发现两个网格之间存在差异。

剑道UI HtmlHelper扩展的Name()用作其相应HTML元素的
id
HTML属性。
id
属性在当前页面中必须是唯一的。如果两次渲染相同的局部视图,两个栅格将以相同的
id
属性结束。因此,只有第一个网格将被初始化。确保页面中的所有HTML元素都有唯一的id。这可以通过在名称()后面添加一些后缀来实现:

@(Html.Kendo().Grid())
.Name(“索引网格”+视图数据[“后缀”])

可以在渲染局部视图的操作方法中设置此后缀。

显示两个网格的时间与执行有问题的行的时间有什么区别吗?这意味着,对于工作的网格,在执行行时它可能已经初始化,而对于有问题的网格,它不是st也有同样的问题

奇怪的是,尽管javascript代码是在页面加载后启动的(使用$(function(){…})),但网格似乎还不能从客户端访问


解决方案:您需要在网格初始化之后放置javascript代码块(@Html.Kendo.grid(…).

两个网格是否各自有不同的名称?不,它们在不同的文件夹中有相同的名称。两个网格的显示时间与问题行的执行时间是否有任何区别?也就是说,对于工作的网格,是否可能在行执行时已经初始化,而对于问题网格,则没有初始化?此外,同名网格不会同时在同一页上使用,对吗?不,它们总是单独使用。不过,您可能会对订单说些什么。我会调查一下,谢谢。如果它起作用,您可以回答。@G\P您是对的,可能会将您的评论作为回答。尽管有些调用
$(“#索引网格”)。数据(“kendoGrid”)
包含在jQuery
$(文档).ready()中
函数,网格本身还没有准备好。我将它们移动到网格
数据绑定
事件的处理程序中,一切正常。如果两个网格在同一页上,我肯定会给它们不同的名称。收到此错误意味着$().data(“kendoGrid”)返回未定义,因为网格由于某种原因未能初始化。请检查JS错误或缺少JS文件。它尚未初始化,但没有初始化失败。
$(document.ready())
在DOM完成时触发,但不考虑intpo。网格仍有一个AJAX“读取”等待数据绑定。@ProfK:我也有同样的问题。你知道如何解决这个问题吗?对不起,@AjitGoel,我几年前就停止使用剑道了。这已经超出了我的预算。
@(Html.Kendo().Grid<TerminalIndexItem>()
      .Name("index-grid" + ViewData["suffix"])