Сохранять дополнительные параметры dataSource.read при разбиении на страницы в сетке данных кендо

У меня есть Kendo Grid, который загружает данные через ajax с вызовом метода чтения ASP.NET на стороне сервера:

 public virtual JsonResult Read(DataSourceRequest request, string anotherParam)

В моем JS на стороне клиента я запускаю чтение при нажатии кнопки:

grid.dataSource.read( { anotherParam: 'foo' });
grid.refresh();

Это работает, как и ожидалось, только я теряю дополнительный параметр, когда перемещаюсь по страницам результатов в сетке или использую значок обновления в сетке для перезагрузки данных.

Как сохранить данные дополнительных параметров в сетке?

Я попытался установить

grid.dataSource.data

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


person Jeremyx    schedule 09.06.2015    source источник
comment
Как выглядит код вашего источника данных? Возможно, вы сможете использовать datasource.transport.parameterMap для передачи параметра каждый раз, когда он читается.   -  person JFlox    schedule 09.06.2015
comment
Джереми, ты когда-нибудь решал эту проблему? У меня точно такая же проблема. Я не могу сохранить информацию о дополнительном параметре после навигации по сетке   -  person Jack    schedule 12.11.2015


Ответы (4)


если вы хотите передать дополнительные параметры в метод Read ajax datasource (на стороне сервера), вы можете использовать

.DataSource(dataSource => dataSource
            ...
            .Read(read => read.Action("Read", controllerName, new { anotherParam= "foo"}))
            ...
        )

если вы хотите передать дополнительные параметры через клиентские сценарии, вы можете использовать datasource.transport.parameterMap, как показано ниже.

parameterMap: function(data, type) {
  if (type == "read") {

     return { request:kendo.stringify(data), anotherParam:"foo" }
  }
person Abbas Galiyakotwala    schedule 09.06.2015

Используйте datasource.transport.parameterMap

parameterMap: function(data, type) {
  if (type == "read") {

     return kendo.stringify(data, anotherParam);
  }

Я не уверен, откуда берется ваш другой параметр, но обычно я отправляю дополнительные параметры на сервер именно так.

http://docs.telerik.com/kendo-ui/api/javascript/data/datasource#configuration-transport.parameterMap

person JFlox    schedule 09.06.2015

если использовать объект источника данных:

var dataSource = new kendo.data.DataSource({
            transport: {
                    read: {
                        url: '/Api/GetData',
                        contentType: "application/json; charset=utf-8", // optional
                        dataType: "json",
                        data: function () {
                            return {
                                additionalParam: value
                            };
                        }
                    },
                //parameterMap: function (data, type) {
                // and so use this property to send additional param
                //    return $.extend({ "additionalParam": value }, data);
                //}
                    },
            schema: {
                type: "json",
                data: function (data) {
                    return data.result;
            },
            },
            pageSize: 5,
            serverPaging: true,
            serverSorting: true
        });

и установите параметры в сетке:

$("#grid").kendoGrid({
    autoBind: false,
    dataSource: dataSource,
    selectable: "multiple cell",
    allowCopy: true,
    columns: [
        { field: "productName" },
        { field: "category" }
    ]
});

и в событии клика этот код:

dataSource.read();

и в веб-методе API это действие:

[HttpGet]
public HttpResponseMessage GetData([FromUri]KendoGridParams/* define class to get parameter from javascript*/ _param)
        {
           // use _param to filtering, paging and other actions
            try
            {

                var result = Service.AllCustomers();
                return Request.CreateResponse(HttpStatusCode.OK, new { result = result });
            }
            catch (Exception ex)
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest, new { result = string.Empty });
            }
        }

удачи.

person HamidReza    schedule 19.01.2017

Чтобы сохранить обновленное значение дополнительного параметра через разбиение на страницы, вам потребуется создать глобальную переменную и сохранить в ней значение.

var anotherParamValue= "";//declare a global variable at the top. Can be assigned some default value as well instead of blank

Затем, когда вы инициируете событие datasource read, вы должны сохранить значение в глобальной переменной, которую мы создали ранее.

anotherParamValue = 'foo';//save the new value to the global variable
grid.dataSource.read( { anotherParam: anotherParamValue });
grid.refresh();

Теперь это важно. В вашем datasource объекте transport.read.data должно быть установлено использование функции, как показано ниже:

var dataSource = new kendo.data.DataSource({
            transport: {
                    read: {
                        url: '/Api/GetData',
                        contentType: "application/json; charset=utf-8", // optional
                        dataType: "json",
                        //Must be set to use a function, to pass dynamic values of the parameter
                        data: function () {
                            return {
                                additionalParam: anotherParamValue //get the value from the global variable
                            };
                        }
                    },

                    },
            schema: {
                type: "json",
                data: function (data) {
                    return data.result;
            },
            },
            pageSize: 5,
            serverPaging: true,
            serverSorting: true
        });

Теперь при каждом нажатии кнопки страницы вы должны получать обновленное значение anotherParam, которое в настоящее время установлено на foo.

person Rahul Gupta    schedule 15.06.2017