还有另一种方法可以在Kendo虚拟化多选小部件上设置初始值吗?

问题描述 投票:0回答:1

我有一个绑定到大量数据的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不在返回的结果的第一页上,则不会选择它们令人沮丧。

javascript c# model-view-controller kendo-ui
1个回答
0
投票

您可以简单地将读取声明更改为以下内容:

 .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...
        }

希望这能为你提供一个起点。

© www.soinside.com 2019 - 2024. All rights reserved.