我有一个绑定到大量数据的kendo多选小部件,为了解决这个问题我已经虚拟化小部件并将压力放到服务器上。
我试图通过传递一组ID的javascript函数选择一些初始数据。只有当被选中的数据位于窗口小部件的第一个分页结果集上时,它才能正常工作,如果任何ID进一步存在,则它们未被选中,我需要修复它。
这是我的小部件的代码:
@(Html.Kendo().MultiSelect()
.Name("Cars")
.DataTextField("Name")
.DataValueField("Id")
.Placeholder("Select cars...")
.Filter(FilterType.Contains)
.DataSource(source => { source
.Custom()
.ServerFiltering(true)
.Events(e => e.Error("errorHandler"))
.ServerPaging(true)
.PageSize(80)
.Type("aspnetmvc-ajax")
.Transport(transport => {
transport.Read("GetData", "Positions");
})
.Schema(schema => { schema
.Data("Data")
.Total("Total")
.Errors("Errors");
});
}))
数据来自位置控制器的GetData
方法,该控制器与我的汽车存储库相关联。
的GetData
public JsonResult GetData([DataSourceRequest] DataSourceRequest request)
{
var car = unitOfWork.CarRepository.Get().OrderBy(n => n.Name);
var results = vessel.ToDataSourceResult(request);
return Json(results);
}
这是我在用户输入(按钮)后运行的功能。我添加了一个示例数组来向您显示传入的内容。
InitialSelection
function initialSelection(filter) {
//filter is: "6544","4880","6545","6548"
var carSelection = $("#Cars").data("kendoMultiSelect");
var filterArray = filter.split(',').map(Number);
if (filterArray.length > 0) {
console.log(filterArray)
carSelection.value(filterArray);
} else {
carSelection.value();
}
}
有没有比我上面的javascript更好的方式来进行初始数据选择?正如我所说的,如果id不在返回的结果的第一页上,则不会选择它们令人沮丧。
您可以简单地将读取声明更改为以下内容:
.Transport(transport => {
transport.Read(read => read.Action("GetData", "Positions").Data("intialvalues"));
})
然后为initialvalues
数据对象添加一个函数,如:
function inititalvalues(){
var filterArray = filter.split(',').map(Number);
if(filterArray === undefined || filterArray === null || filterArray.length <= 0)
{
filterArray = []
}
return {filterValues: filterArray};
}
然后在控制器上的read方法中添加以下内容:
public JsonResult GetData([DataSourceRequest] DataSourceRequest request, List<int> filterValues)
{
if (filterValues.Count > 0 && request.Page == 1)
{
..get the first page minus how many filterValues you have to inject the selected Items at the top of the list...
}
else if (filterValues.Count > 0 && request.Page > 1)
{
..get the page you need and remove any selected items from the page as they will be at the top...
}
else
{
..just get everything as normal as nothing should be selected at this stage.
}
return your paged resultset back...
}
希望这能为你提供一个起点。