ABP Blazor项目DataGrid按书名实现自定义筛选方法
ABP框架Blazor Server图书列表名称列自定义筛选实现
你不需要手动构造静态数据列表,直接复用现有AbpCrudPageBase基类封装的Entities集合、数据读取、分页逻辑即可,根据需求选以下两种实现方式:
方案1:服务端筛选(推荐,适配分页场景,支持全量数据匹配)
该方案筛选逻辑走后端查询,不会出现仅筛选当前页数据的问题,和现有分页、排序逻辑完全兼容。
- 替换名称列代码,增加自定义筛选输入框
找到原有Name字段对应的DataGridColumn节点,替换为带筛选模板的代码:
<DataGridColumn TItem="BookDto" Field="@nameof(BookDto.Name)" Caption="@L["Name"]"> <FilterTemplate> <TextEdit Text="@nameFilterValue" TextChanged="@(v => OnNameFilterChanged(v))" Placeholder="输入图书名称筛选" /> </FilterTemplate> </DataGridColumn>
- 扩展查询参数DTO
默认基类使用的PagedAndSortedResultRequestDto不带自定义筛选字段,在应用服务契约层新增查询DTO继承原有基类:
public class GetBookListDto : PagedAndSortedResultRequestDto { public string? NameFilter { get; set; } }
- 修改页面继承声明,增加筛选逻辑
将页面顶部的@inherits节点替换为使用新查询DTO的泛型定义:
@inherits AbpCrudPageBase<IBookAppService, BookDto, Guid, GetBookListDto, CreateUpdateBookDto>
在页面@code块中增加筛选字段和处理方法,直接复用基类的数据读取逻辑:
private string nameFilterValue; private async Task OnNameFilterChanged(string value) { nameFilterValue = value; // 触发DataGrid重新加载,自动复用现有分页参数 await DataGrid.Reload(); } protected override async Task OnDataGridReadAsync(DataGridReadDataEventArgs<BookDto> e) { // 将筛选值传入查询参数 CurrentReadInput.NameFilter = nameFilterValue; // 调用基类原有数据请求逻辑,无需手动处理Entities赋值 await base.OnDataGridReadAsync(e); }
- 最后在
BookAppService的列表查询方法中,增加名称字段的模糊匹配条件即可,和原有MongoDB查询、分页排序逻辑合并。
方案2:前端本地筛选(仅适用于小数据量场景)
如果不需要跨页筛选,仅对当前页已加载到Entities集合中的数据做筛选,无需修改后端代码:
- 给DataGrid组件增加自定义筛选方法绑定
<DataGrid TItem="BookDto" Data="Entities" ReadData="OnDataGridReadAsync" TotalItems="TotalCount" ShowPager="true" PageSize="PageSize" CustomFilter="@OnBookLocalFilter"> <!-- 其余列配置和方案1的名称列筛选模板保持不变 -->
- 在
@code块中增加本地筛选判断逻辑,DataGrid会自动遍历当前Entities集合的每一项执行判断,无需手动构造静态列表:
private string nameFilterValue; private bool OnBookLocalFilter(BookDto book) { if (string.IsNullOrWhiteSpace(nameFilterValue)) { return true; } return book.Name?.Contains(nameFilterValue, StringComparison.OrdinalIgnoreCase) ?? true; } private async Task OnNameFilterChanged(string value) { nameFilterValue = value; await DataGrid.Reload(); }
注意:该方案仅对当前分页已加载的数据生效,不会请求其他分页的匹配结果。
内容的提问来源于stack exchange,提问作者jcb
相关产品推荐
相关产品推荐

