You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kendo Grid动态列无限滚动第二页数据为空问题排查

问题根源与修复方案

你的核心问题是重复执行了分页逻辑:你已经通过存储过程完成了数据库端的分页,却又调用ToDataSourceResult(request)让Kendo再次对已分页的DataTable应用分页规则。当第二次请求时,request.Page为2,Kendo会尝试从仅包含100条数据的DataTable中取第2页,自然返回空数据。

以下是具体修复步骤和优化后的代码:


1. 移除重复分页逻辑

直接将数据库返回的DataTable转为可枚举集合,不再调用ToDataSourceResult(该方法仅适用于全量数据的客户端分页场景)。

2. 修复偏移量硬编码问题

GetViewsData中偏移量计算用了固定值100,应改为使用传入的pageSize参数,确保分页逻辑与Kendo请求参数一致。

3. 优化数据库资源管理

使用using语句自动释放数据库连接、命令等资源,避免连接泄漏。

4. 调整DataTable填充顺序

先调用FillSchema获取表结构,再填充数据,确保动态列的元数据正确。


修改后的Controller代码

public IActionResult Data_Read([DataSourceRequest] DataSourceRequest request)
{
    var dt = GetViewsData(request.PageSize, request.Page);
    // 直接将DataTable转为可枚举集合,跳过Kendo的二次分页
    var viewData = new DataSourceResult()
    {
        Data = dt.AsEnumerable(),
        Total = GetDataTotalCount() // 替换硬编码为真实总行数查询
    };
    return Json(viewData);
}

public DataTable GetViewsData(int pageSize, int page)
{
    try
    {
        // 修复偏移量计算:使用传入的pageSize而非固定值
        int offSet = (page - 1) * pageSize;
        string connString = "Server=.; Database=TheVault_VMC; Trusted_Connection=true; MultipleActiveResultSets=True; Encrypt=False;";
        
        // using语句自动管理连接生命周期
        using (SqlConnection con = new SqlConnection(connString))
        {
            con.Open();
            using (SqlCommand cmd = new SqlCommand("sp_GetData", con))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@OFFSetRows", offSet);
                cmd.Parameters.AddWithValue("@PageSize", pageSize);
                
                SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
                var dataTable = new DataTable();

                // 先获取表结构,再填充数据
                dataAdapter.FillSchema(dataTable, SchemaType.Mapped);
                dataAdapter.Fill(dataTable);
                
                return dataTable;
            }
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

// 新增:查询真实总行数的方法
private int GetDataTotalCount()
{
    string connString = "Server=.; Database=TheVault_VMC; Trusted_Connection=true; MultipleActiveResultSets=True; Encrypt=False;";
    using (SqlConnection con = new SqlConnection(connString))
    {
        con.Open();
        using (SqlCommand cmd = new SqlCommand("sp_GetDataTotalCount", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            return (int)cmd.ExecuteScalar();
        }
    }
}

新增总行数查询存储过程

CREATE PROCEDURE [dbo].[sp_GetDataTotalCount]
AS
BEGIN
    SELECT COUNT(*) FROM [StagingDetail]
END

内容的提问来源于stack exchange,提问作者Atif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:42:55