在KendoUI网格上选择行时遇到问题。我有两个网格,需要根据控制器返回的数据预先选择行。问题是,选择过程没有持续工作,这似乎是因为数据访问时间,即控制器返回通过ajax功能客户端请求的数据所需的时间。
为了验证这一理论,我在控制器中设置了一个间隔,以错开返回的数据,它起到了作用,但又一次,它并不一致。以下是两个网格的代码:
容器网格
@(Html.Kendo().Grid<Vessel>()
.Name("VesselGrid")
.Columns(columns => {
columns.Select().Width(50);
columns.Bound(p => p.Id);
columns.Bound(p => p.Name);
})
.Pageable()
.Selectable(selectable => selectable.Mode(GridSelectionMode.Multiple))
.Scrollable()
.Filterable(ftb => ftb.Mode(GridFilterMode.Row))
.PersistSelection()
.HtmlAttributes(new { style = "height:550px;" })
.DataSource(dataSource => dataSource
.Ajax()
.ServerOperation(true)
.PageSize(20)
.Model(m => m.Id(x => x.Id))
.Read(read => read.Action("ReadVessels", "Core"))))
柱网
@(Html.Kendo().Grid<VesselColumn>()
.Name("columnGrid")
.Columns(columns => {
columns.Bound(p => p.Id);
columns.Bound(p => p.ColumnName);
})
.Pageable()
.Sortable(Sortable => Sortable.AllowUnsort(true))
.Selectable(selectable => selectable.Mode(GridSelectionMode.Multiple))
.Scrollable()
.Filterable(ftb => ftb.Mode(GridFilterMode.Row))
.PersistSelection()
.HtmlAttributes(new { style = "height:550px;" })
.DataSource(dataSource => dataSource
.Ajax()
.ServerOperation(true)
.PageSize(20)
.Model(m => m.Id(x => x.Id))
.Read(read => read.Action("ReadVesselColumns", "Core"))))
下面是在document ready上调用的ajax函数,它应该预先选择每个网格上的行。
$(function () {
$.ajax({
type: 'POST',
url: '/Test/ReadUserVessels',
data: { Id: 230 },
success: function (data) {
setVessels(data);
},
error: function () {
alert('error');
}
});
$.ajax({
type: 'POST',
url: '/Test/ReadUserColumns',
data: { Id: 230 },
success: function (data) {
setColumns(data);
},
error: function () {
alert('error');
}
});
function setVessels(data) {
$(data.vessels).each(function (vIndex, vValue) {
$("#vesselGrid").getKendoGrid()._selectedIds[vValue.VesselId] = true;
});
}
function setColumns(data) {
$(data.columns).each(function (cIndex, cValue) {
$("#columnGrid").getKendoGrid()._selectedIds[cValue.ColumnId] = true;
});
}
})
以下是将数据返回到这些函数以突出显示行的控制器操作。
public async Task<JsonResult> ReadUserVessels(int? id) {
IEnumerable<UserVessels> vessels = _userVesselService.GetUserVessels().Where(x => x.ViewId == id).ToList();
return Json(new { success = true, vessels });
}
public async Task<JsonResult> ReadUserColumns(int? id) {
IEnumerable<UserColumn> columns = _userColumnService.GetUserColumns().Where(x => x.ViewId == id).ToList();
return Json(new { success = true, columns});
}
如您所见,当文档准备就绪时,页面被加载,同时对两个控制器操作进行两个ajax调用。从那里,网格上的行应该被选中并以蓝色突出显示。只有船只网格能做到这一点。
我的猜测是,由于请求发出,无论哪个进程处理网格上行的选择,当columns网格要求做同样的事情时,它仍然在使用。这是一个理论,我通过设置控制器动作的间隔来测试,该间隔为2秒。它奏效了,但前后不一致。
所以,我的问题是,我应该使用异步控制器操作来访问数据吗?如果是,有人能帮助我如何实现这一点吗?或者我的方法是否不正确?