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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:39:32