Возврат метаданных из.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
        });
    }

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

Другие вопросы по тегам