New to KendoReactStart a free 30-day trial

Integration with UI for ASP.NET Core
Premium

Updated on Sep 2, 2026

Telerik UI for ASP.NET Core and Telerik UI for ASP.NET MVC include a DataSourceRequest model binder and a ToDataSourceResult() extension method. These let the server receive a Kendo UI component data-state object, apply the sort, filter, group, and page operations, and return the result in a format the component can consume directly.

Data Query provides the client-side helpers:

How It Works

The integration follows a request-response cycle:

  1. The component raises a data-state change event when the user sorts, filters, or pages the data.
  2. The application calls toDataSourceRequestString to serialize the new state.
  3. The serialized string is sent to the ASP.NET Core endpoint as a query string.
  4. The server deserializes it using the DataSourceRequest model binder, applies the operations with ToDataSourceResult(), and returns the result as JSON.
  5. If the data is grouped, the application calls translateDataSourceResultGroups and translateAggregateResults to convert the server response before passing it to the component.

Server-Side Controller

The following example demonstrates a minimal ASP.NET Core controller that processes a DataSourceRequest and returns the result:

csharp
using Microsoft.AspNetCore.Mvc;
using Kendo.Mvc.UI;
using Kendo.Mvc.Extensions;

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    [HttpGet]
    public IActionResult GetProducts([DataSourceRequest] DataSourceRequest request)
    {
        // Replace with a database query when using Entity Framework.
        var products = ProductRepository.All().AsQueryable();
        return Ok(products.ToDataSourceResult(request));
    }
}

Client-Side Integration

For a complete, runnable project, see the KendoReact with ASP.NET Core sample on GitHub.

The following example demonstrates a React hook that fetches Grid data from the ASP.NET Core endpoint:

jsx
import { useState, useEffect } from 'react';
import { toDataSourceRequestString, translateDataSourceResultGroups } from '@progress/kendo-data-query';

function useServerData(initialState) {
    const [dataState, setDataState] = useState(initialState);
    const [result, setResult] = useState({ data: [], total: 0 });

    useEffect(() => {
        const queryStr = toDataSourceRequestString(dataState);
        const hasGroups = dataState.group && dataState.group.length;

        fetch(`api/products?${queryStr}`)
            .then(response => response.json())
            .then(({ data, total }) => {
                setResult({
                    // Only grouped responses need remapping to the hierarchical format the Grid expects.
                    data: hasGroups ? translateDataSourceResultGroups(data) : data,
                    total
                });
            });
    }, [dataState]);

    return { result, dataState, setDataState };
}

See Also