New to Kendo UI for jQueryStart a free 30-day trial

Use Web API with Server-Side Operations

Environment

ProductProgress® Kendo UI® for jQuery

Description

How can I implement the server-side data operations of paging, sorting, and filtering with WebAPI and the Data Grid?

Solution

Kendo UI does not provide any out-of-the-box capability for implementing server-side paging, sorting, and grouping.

However, you can implement server-side data operations by using Telerik UI for ASP.NET Core. The following example demonstrates how to use the ToDataSourceResult extension method to implement the server-side data operations of paging, sorting, and grouping.

Controller
using ApiJqueryGrid.Models;
using Kendo.Mvc.Extensions;
using Kendo.Mvc.UI;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;

namespace ApiJqueryGrid.Controllers
{
    [Route("api/[controller]")]
    public class GridController : ControllerBase
    {
        private static List<OrderViewModel> orders;

        [HttpGet("Read")]
        public DataSourceResult GetOrders([DataSourceRequest] DataSourceRequest request)
        {
            if (orders == null)
            {
                orders = Enumerable.Range(1, 50).Select(i => new OrderViewModel
                {
                    OrderID = i,
                    Category = new Category() { CategoryID = 2, CategoryName = "Delivered" },
                    OrderDate = new DateTime(2016, 9, 15).AddDays(i % 7),
                    ShipName = "ShipName " + i,
                    ShipCity = "ShipCity " + i
                }).ToList();
            }


            return orders.ToDataSourceResult(request);
        }

        [HttpPost("Create")]
        public IActionResult Create(OrderViewModel order)
        {
            order.OrderID = orders.Count + 1;
            orders.Add(order);

            return new ObjectResult(new DataSourceResult { Data = new[] { order }, Total = 1 });
        }

        [HttpPut("Update")]
        public IActionResult Update(OrderViewModel order)
        {

            return new StatusCodeResult(200);
        }

        [HttpDelete("Destroy")]
        public IActionResult Destroy(OrderViewModel order)
        {
            orders.Remove(order);

            return new StatusCodeResult(200);
        }
    }
}

The dataSource type Web API is intended for Telerik UI for ASP.NET Core. As a result, you need to include kendo.aspnetmvc.js.

jQuery
    <div id="grid"></div>
    <script>
        $("#grid").kendoGrid({
            columns: [
                { "title": "Order ID", "width": "100px", "field": "OrderID" },
                { "title": "Ship City", "width": "200px", "field": "ShipCity" },
                { "title": "Ship Name", "width": "200px", "field": "ShipName" },
                { "title": "Order Date", "width": "200px", "field": "OrderDate", format: "{0:dd/MM/yyyy}" },
                { "title": "Category", "width": "200px", "field": "Category", editor: categoryDropDownList, template: "#=Category.CategoryName#" },
                { command: ["edit", "destroy"], "width": "150px" }
            ],
            toolbar: ["create"],
            groupable: true,
            pageable: true,
            sortable: true,
            filterable: true,
            editable: "inline",
            dataSource: {
                type: "webapi",
                transport: {
                    read: {
                        url: "/api/Grid/Read"
                    },
                    update: {
                        url: "/api/Grid/Update"
                    },
                    create: {
                        url: "/api/Grid/Create"
                    },
                    destroy: {
                        url: "/api/Grid/Destroy"
                    }
                },
                pageSize: 20,
                serverPaging: true,
                serverSorting: true,
                serverFiltering: true,
                serverGrouping: true,
                serverAggregates: true,
                schema: {
                    data: "Data",
                    total: "Total",
                    errors: "Errors",
                    model: {
                        id: "OrderID",
                        fields: {
                            OrderID: { type: "number", editable: false },
                            ShipCity: { type: "string" },
                            ShipName: { type: "string" },
                            OrderDate: { type: "date" },
                            Category: { defaultValue: {CategoryID: 1, CategoryName: "En Route"} },
                        }
                    }
                }
            }
        });

        function categoryDropDownList(container, options) {
            $('<input required name="' + options.field + '"/>')
                .appendTo(container)
                .kendoDropDownList({
                    dataTextField: "CategoryName",
                    dataValueField: "CategoryID",
                    dataSource: {
                        data: [{ CategoryID: 1, CategoryName: "En Route" }, { CategoryID: 2, CategoryName: "Delivered" }]
                    }
                });
        }
    </script>

See Also