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

Kendo Grid外键列过滤器未生效,如何基于网格内容过滤?

解决Kendo Grid自定义过滤器未触发,仅基于网格现有内容过滤的问题

我帮你排查了下代码里的问题,你的自定义过滤器没触发主要是语法错误和字段名不匹配导致的,另外还可以优化函数让过滤器显示更友好的内容。下面是具体的修复步骤和代码:

一、先修正Grid列配置里的语法错误

你的第二个列的Filterable配置中,{field: NameId}里的NameId没有加引号,这会导致JavaScript语法错误,直接让自定义函数无法执行;另外第一个列的field设置成了'Id',但你的列绑定的是HouseId,字段名不匹配,即使函数执行了也拿不到正确的数据。

修正后的Grid列配置代码:

@(Html.Kendo().Grid<Kendo_UI_Bootstrap_Integration.Models.DTO.GridDto>()
    .Name("GridName")
    .Filterable(f => f.Mode(GridFilterMode.Menu).Extra(false))
    .EnableCustomBinding(true)
    .Columns(columns => {
        columns.ForeignKey(c => c.HouseId, Model.Homes, "HouseGuid", "HouseName")
            .EditorTemplateName("HouseDropDown")
            .Title("House Name")
            .Filterable(f => f.UI("$.proxy(GridFilter, {field: 'HouseId'})")
                .Operators(o => o.ForString(e => e.Clear().IsEqualTo("Is equal to").IsNotEqualTo("Is not equal to"))));

        columns.ForeignKey(c => c.NameId, Model.Names, "NameGuid", "Name")
            .EditorTemplateName("NameDropDown")
            .Title("Name")
            .Filterable(f => f.UI("$.proxy(GridFilter, {field: 'NameId'})")
                .Operators(o => o.ForString(e => e.Clear().IsEqualTo("Is equal to").IsNotEqualTo("Is not equal to"))));
    })
)

二、优化自定义过滤器函数

原来的函数只收集了ID值,过滤器里会显示Guid字符串,体验不好。我调整了函数,让它同时收集ID和对应的显示名称,去重后按名称排序,这样过滤器里显示的是友好的名称,实际传的是ID值:

function GridFilter(element) {
    var grid = $("#GridName").data("kendoGrid");
    var fieldName = this.field;
    // 根据ID字段匹配对应的显示字段
    var displayField = fieldName === 'HouseId' ? 'HouseName' : 'Name';
    
    // 用Set做去重,效率更高
    var uniqueIds = new Set();
    // 筛选出唯一的条目,同时整理成DropDown需要的结构
    var filterItems = grid.dataSource.data().filter(item => {
        var itemId = item[fieldName];
        if (itemId !== null && !uniqueIds.has(itemId)) {
            uniqueIds.add(itemId);
            return true;
        }
        return false;
    }).map(item => ({
        value: item[fieldName],
        text: item[displayField]
    }));
    
    // 按显示名称排序
    filterItems.sort((a, b) => a.text.localeCompare(b.text));
    
    // 初始化DropDownList
    $(element).kendoDropDownList({
        dataSource: filterItems,
        dataValueField: "value",
        dataTextField: "text",
        optionLabel: "--请选择--" // 可选,添加默认提示
    });
}

三、关键说明

  • 如果你的网格开启了分页,dataSource.data()会获取所有已加载到本地的网格数据;如果只想基于当前页的内容过滤,可以把dataSource.data()改成dataSource.view()。
  • 修正语法错误后,自定义过滤器就能正常触发,替代原来使用ViewModel中数据库数据的默认过滤器,实现仅基于网格现有内容过滤的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:28:33