.NET7 DevExpress Grid服务端分页实现指导及问题排查
DevExpress Grid + .NET7 服务端分页实现指南及问题排查
常见问题排查
- 未启用服务端绑定模式:DevExpress Grid默认采用客户端分页,需显式配置自定义绑定路由指定分页处理逻辑,否则分页操作会在本地内存中执行。
- 分页参数未正确传递:未从Grid的请求中获取
PageIndex、PageSize等参数,导致后端分页逻辑无效。 - 过早执行
ToList():若先调用ToList()将数据加载到内存再分页,本质仍是客户端分页,必须在IQueryable层面完成分页后再执行数据库查询。 - 总记录数未返回:Grid需要总条数来生成分页控件,需单独查询总记录数,不能用分页后的集合计数。
实现步骤及示例
1. Razor页面Grid配置
@page "/data-grid" @model DataGridPageModel @{ var grid = Html.DevExpress().GridView(settings => { settings.Name = "dataGrid"; // 指定回调路由 settings.CallbackRouteValues = new { Page = "/data-grid" }; // 绑定服务端分页处理方法 settings.CustomBindingRouteValuesCollection.Add(GridViewOperationNames.Paging, "GetPagedData"); // 配置列(根据你的实体调整) settings.Columns.Add("Id"); settings.Columns.Add("ProductName"); settings.Columns.Add("Price"); // 启用分页器 settings.SettingsPager.Mode = GridViewPagerMode.ShowPager; settings.SettingsPager.PageSize = 15; settings.Settings.ShowFilterRow = true; }); } @grid.BindToCustomData(Model.GridData).GetHtml()
2. Razor Pages PageModel代码
using DevExpress.Web.Mvc; using Microsoft.EntityFrameworkCore; public class DataGridPageModel : PageModel { private readonly AppDbContext _dbContext; public DataGridPageModel(AppDbContext dbContext) { _dbContext = dbContext; } public GridViewCustomBindingData GridData { get; set; } public async Task OnGet() { // 初始化第一页数据 GridData = await GetPagedDataAsync(new GridViewPagerState { PageIndex = 0, PageSize = 15 }); } public async Task<IActionResult> OnGetGetPagedData(GridViewPagerState pager) { int pageIndex = pager.PageIndex; int pageSize = pager.PageSize; // 保持查询为IQueryable,避免提前加载数据 var query = _dbContext.Products.AsQueryable(); // 计算总记录数(分页前执行) int totalCount = await query.CountAsync(); // 执行分页查询 var pagedData = await query .Skip(pageIndex * pageSize) .Take(pageSize) .ToListAsync(); // 返回Grid所需的分页数据结构 var result = new GridViewCustomBindingGetDataResult { Data = pagedData, TotalRowCount = totalCount }; return PartialView("_GridPartial", result); } }
3. 关键注意事项
- 所有筛选、排序逻辑需在
Skip()/Take()之前通过IQueryable完成,确保操作被转换为SQL语句在数据库端执行。 - 确认使用的DevExpress版本兼容.NET7,建议升级到v22.2及以上版本。
- 若分页控件仍不显示,检查
TotalRowCount是否正确传递,以及SettingsPager.Mode是否设置为ShowPager。
内容的提问来源于stack exchange,提问作者Naved
相关产品推荐
相关产品推荐

