Есть ли другой способ установить начальные значения в виджете виртуальной мутации Kendo? - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть мульти-выборочный виджет kendo, который связан с большим количеством данных, чтобы справиться с этим, я виртуализировал виджет и поместил нагрузку на сервер.

Я пытаюсь выбрать некоторые исходные данные с помощью функции javascript, которая передает массив идентификаторов.Он работает хорошо только в том случае, если выбранные данные находятся в первом постраничном результирующем наборе виджета, если какой-либо из идентификаторов находится дальше, тогда они не выбраны, и мне нужно исправить это.

Вот код для моего виджета:

@(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?Как я уже сказал, если идентификаторы не находятся на первой странице результатов, которые возвращаются, они не выбираются, что расстраивает.

1 Ответ

0 голосов
/ 12 сентября 2018

Вы можете просто изменить объявление чтения на что-то вроде этого:

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

, затем в вашем чтенииМетод на вашем контроллере вы добавляете следующее:

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

, надеюсь, это даст вам отправную точку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...