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

时间:2018-09-12 10:37:44

标签: javascript c# model-view-controller kendo-ui

我有一个绑定到大量数据的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");
    });
}))

数据是从与我的汽车资料库相关联的Positions控制器的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不在返回结果的首页上,则不会选择它们,这很令人沮丧。

1 个答案:

答案 0 :(得分:0)

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

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

希望这会为您提供一个起点。