Возврат метаданных из.Read() и использование их в сетке кендо
Я использую сетку с asp.net MVC. В настоящее время сетка использует .DataSource(c => c.Read())
вызвать URL, который возвращает IEnumerable<item>
который идет в сетку.
Я хочу реализовать пейджинг в сетке. Однако данные не имеют обычного метода подкачки (счетчик, номер страницы и т. Д.).
Вместо этого, когда я получаю свои данные изнутри, я получаю данные обратно так:
{ items: [. . . ], nextPage: 'J23jeg9e93', previousPage: 'oqow0r93285' }
Чтобы перейти на следующую страницу, вы должны снова запросить данные, но включить токен подкачки для следующей или предыдущей страницы.
На данный момент я только возвращаю массив элементов в сетку, поэтому нет метаданных nextPage / previousPage.
Я не вижу способа включить эти метаданные, так как я просто возвращаю IEnumerable элементов, поэтому нет объекта-оболочки, в который можно было бы поместить метаданные.
я могу использовать .Data()
чтобы прикрепить метаданные к запросу на чтение, но мне нужно сделать это наоборот. После того, как я верну метаданные, мне нужно будет сохранить их в переменной javascript, чтобы я мог отправить их в .Data()
1 ответ
Я не знаю, как вы на самом деле запускаете операции NextPage, PreviousPage, но...
Вы можете использовать конфигурацию пользовательского источника данных MVC, чтобы обеспечить доступ к дополнительным параметрам, таким как конфигурация схемы. http://docs.telerik.com/aspnet-mvc/getting-started/custom-datasource
Конфигурация схемы позволяет вам добавить функцию анализа, которая может принимать ваш собственный формат результата:
{ items: [. . . ], nextPage: 'J23jeg9e93', previousPage: 'oqow0r93285' }
и извлеките элементы (для передачи в сетку) И значения nextPage, previousPage (для сохранения для передачи следующему запросу на чтение).
Например:
Образец сетки:
@(Html.Kendo().Grid<TelerikMvcApp4.Models.GridViewModel>()
.Name("grid")
.DataSource(ds => ds
.Custom()
.Batch(true)
.Schema(schema => schema
.Parse(@<text>parseData</text>)
)
.Transport(transport => transport
.Read(read => read.Action("Grid_Read", "Home").Type(HttpVerbs.Post).Data("readData"))
)
.PageSize(1)
.ServerPaging(true)
)
.Pageable()
)
Пример parseData и readData javascript:
<script>
var nextPage,
previousPage;
function readData() {
// Return the "extra" data that should be posted with each grid read request, which is the nextPage/previousPage we were given in the previous request respsonse.
return {
nextPage: nextPage,
previousPage: previousPage
};
}
function parseData(data) {
// Parse the response from the server as it isn't in the typical format expected by the grid.
// Extract your nextPage/previousPage, store it somewhere so they can be added to the next grid request.
nextPage = data.nextPage;
previousPage = data.previousPage;
// Return the actual data that should be displayed in the grid.
return data.items;
}
</script>
Пример чтения сетки:
[HttpPost]
public ActionResult Grid_Read([DataSourceRequest] DataSourceRequest request, string nextPage, string previousPage)
{
// "Fetch" the data, presumably doing something with nextPage and previousPage...
var items = new List<GridViewModel>()
{
new GridViewModel() { name = "bob", age = 23},
new GridViewModel() { name = "jim", age = 43},
};
// Determine what the new nextPage, previousPage should be...
var newNextPage = "J23jeg9e93";
var newPreviousPage = "oqow0r93285";
return Json(new
{
items = items,
nextPage = newNextPage,
previousPage = newPreviousPage
});
}
Это не полное и надежное решение, но я думаю, что его можно сделать работоспособным и, по крайней мере, укажет вам возможное направление.