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
相关产品推荐
相关产品推荐

