为什么在KendoUI虚拟化多选中更改初始值?

时间:2018-09-13 15:17:51

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

我有一个虚拟的KendoUI多选小部件,该部件使用其网站上记录的值映射器方法传递初始值。我的问题是小部件返回初始值时会发生变化。

例如,我传递了一个我最初希望选择265,4880,4545,2548的ID数组,一旦值映射器方法处理了此ID,返回值就是264,2547,4544,4879,这显然不同于我问,有人可以帮助我确定代码中出了什么问题吗?

这是我的多选小部件代码

@(Html.Kendo().MultiSelect()
.Name("Cars")
.DataTextField("Name")
.DataValueField("Id")
.AutoBind(true)
.DataSource(source => {
    source.Custom()
    .ServerFiltering(true)    
    .ServerPaging(true)
    .PageSize(100)
    .Type("aspnetmvc-ajax")
    .Transport(transport => {
        transport.Read(read => read.Action("GetCars", "Cars"));
    })
    .Schema(schema => {
        schema
            .Data("Data")
            .Total("Total")
            .Errors("Errors");
        });
}).Virtual(v => v.ValueMapper("valueMapper")))

这是我对应的javascript函数。

初始选择

function initialSelection() {
    //Triggered on page load
    //For test purposes I've defined the array here as filter.
    var filter = "265,4880,4545,2548"
    var carSelection = $("#Cars").data("kendoMultiSelect");
    var filterArray = filter.split(',').map(Number);        

    if (filterArray.length > 0) {
        carSelection.value(filterArray);
    } else {
        carSelection.value();
    }
}

价值映射器

function valueMapper(options) {
    $.ajax({
        url: "@Url.Action("CarsValueMapper", "Cars")",
        data: convertValues(options.value),
        success: function (data) {
            options.success(data);
        }
    });
}

转换值

function convertValues(value) {
    var data = {};
    value = $.isArray(value) ? value : [value];
    for (var idx = 0; idx < value.length; idx++) {
        data["values[" + idx + "]"] = value[idx];            
    }
    console.log("Convert Values (data)");
    console.log(data);
    return data;
}

以下代码段来自我的控制器。

获得汽车

public JsonResult GetCars([DataSourceRequest] DataSourceRequest request)
{
    var car = unitOfWork.carRepository.Get();
    return Json(car.ToDataSourceResult(request));
}

**值映射器**

public ActionResult CarsValueMapper(int[] values)
{
    var indices = new List<int>();
    if (values != null && values.Any())
    {
        var index = 0;
        foreach (var car in GetAllCars())
        {
            if (values.Contains(car.Id))
            {
                indices.Add(index);
            }
            index += 1;
        }
    }
     return Json(indices, JsonRequestBehavior.AllowGet);
}

获得所有汽车

private static IEnumerable<Car> GetAllCars()
{
    var cars = Enumerable.Range(1, 6000).Select(i => new Car
    {
        Id = i
    });
    return cars;
}

我放置了一些断点来追查错误,并且我注意到该行为发生在CarsValueMapper方法中。谁能帮助我了解问题出在哪里以及为什么要更改ID?

非常感谢

0 个答案:

没有答案