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

如何在独立类中声明Kendo MVC Grid过滤器?附代码示例

在独立类中封装Kendo MVC Grid过滤器的可行方案

我来分享几个实用的方案,帮你把Kendo MVC Grid的过滤器配置从150+个页面中抽离出来,实现统一管理——毕竟重复写相同的过滤代码太浪费时间了!

方案1:静态扩展方法(最简洁的统一配置)

这种方式直接给StringOperationsBuilder(以及其他类型的Filter Builder)添加扩展方法,调用起来非常简洁,适合所有页面用相同过滤器配置的场景。

实现代码

public static class KendoGridFilterExtensions
{
    /// <summary>
    /// 配置默认的字符串过滤器选项
    /// </summary>
    public static StringOperationsBuilder UseDefaultStringFilter(this StringOperationsBuilder builder)
    {
        return builder
            .Clear()
            .Contains("Contains")
            .DoesNotContain("Does not contain")
            .StartsWith("Starts with")
            .EndsWith("Ends with")
            .IsEqualTo("Is equal to")
            .IsNotEqualTo("Is not equal to")
            .IsNull("Is null")
            .IsNotNull("Is not null");
    }

    // 可以扩展其他类型的过滤器,比如数字、日期
    public static NumberOperationsBuilder UseDefaultNumberFilter(this NumberOperationsBuilder builder)
    {
        return builder
            .Clear()
            .IsEqualTo("Is equal to")
            .IsNotEqualTo("Is not equal to")
            .IsGreaterThan("Is greater than")
            .IsGreaterThanOrEqualTo("Is greater than or equal to")
            .IsLessThan("Is less than")
            .IsLessThanOrEqualTo("Is less than or equal to")
            .IsNull("Is null")
            .IsNotNull("Is not null");
    }
}

在Grid中使用

// 字符串列
.Columns(columns =>
{
    columns.Bound(p => p.ProductName)
           .Filterable(filter => filter
               .ForString(str => str.UseDefaultStringFilter())
           );
})

// 数字列(可选)
columns.Bound(p => p.UnitPrice)
       .Filterable(filter => filter
           .ForNumber(num => num.UseDefaultNumberFilter())
       );

方案2:集中式过滤器配置类

如果需要管理多种过滤器变体(比如不同页面用不同的过滤选项),可以把所有配置逻辑集中到一个静态类里,方便统一修改和维护。

实现代码

public static class KendoFilterConfigurations
{
    /// <summary>
    /// 应用默认字符串过滤器
    /// </summary>
    public static void ApplyDefaultStringFilter(StringOperationsBuilder builder)
    {
        builder
            .Clear()
            .Contains("Contains")
            .DoesNotContain("Does not contain")
            .StartsWith("Starts with")
            .EndsWith("Ends with")
            .IsEqualTo("Is equal to")
            .IsNotEqualTo("Is not equal to")
            .IsNull("Is null")
            .IsNotNull("Is not null");
    }

    /// <summary>
    /// 应用简化版字符串过滤器(比如只保留常用选项)
    /// </summary>
    public static void ApplySimplifiedStringFilter(StringOperationsBuilder builder)
    {
        builder
            .Clear()
            .Contains("Contains")
            .IsEqualTo("Is equal to")
            .IsNull("Is null");
    }
}

在Grid中使用

columns.Bound(p => p.CategoryName)
       .Filterable(filter => filter
           .ForString(str => KendoFilterConfigurations.ApplyDefaultStringFilter(str))
       );

// 另一个页面用简化版过滤器
columns.Bound(p => p.SupplierName)
       .Filterable(filter => filter
           .ForString(str => KendoFilterConfigurations.ApplySimplifiedStringFilter(str))
       );

方案3:依赖注入式配置(适合动态场景)

如果你的项目使用了依赖注入,并且需要根据用户角色、页面类型动态调整过滤器选项,可以把过滤器配置做成可注入的服务,灵活性更高。

1. 定义配置接口

public interface IKendoFilterService
{
    void ConfigureDefaultStringFilter(StringOperationsBuilder builder);
    void ConfigureAdminStringFilter(StringOperationsBuilder builder);
}

2. 实现配置服务

public class KendoFilterService : IKendoFilterService
{
    public void ConfigureDefaultStringFilter(StringOperationsBuilder builder)
    {
        ApplyDefaultStringFilter(builder);
    }

    public void ConfigureAdminStringFilter(StringOperationsBuilder builder)
    {
        // 管理员专属的过滤选项,比如多几个高级选项
        builder
            .Clear()
            .Contains("Contains")
            .DoesNotContain("Does not contain")
            .StartsWith("Starts with")
            .EndsWith("Ends with")
            .IsEqualTo("Is equal to")
            .IsNotEqualTo("Is not equal to")
            .IsNull("Is null")
            .IsNotNull("Is not null")
            .IsEmpty("Is empty")
            .IsNotEmpty("Is not empty");
    }

    private void ApplyDefaultStringFilter(StringOperationsBuilder builder)
    {
        // 复用默认配置逻辑
        builder
            .Clear()
            .Contains("Contains")
            .IsEqualTo("Is equal to")
            .IsNull("Is null")
            .IsNotNull("Is not null");
    }
}

3. 注册服务(Startup.cs/Program.cs)

// .NET Core 3.1+
services.AddScoped<IKendoFilterService, KendoFilterService>();

4. 在Controller和View中使用

// Controller中注入服务
public class ProductsController : Controller
{
    private readonly IKendoFilterService _filterService;

    public ProductsController(IKendoFilterService filterService)
    {
        _filterService = filterService;
    }

    public IActionResult Index()
    {
        ViewBag.FilterService = _filterService;
        return View();
    }
}

// View中调用
columns.Bound(p => p.ProductName)
       .Filterable(filter => filter
           .ForString(str => ViewBag.FilterService.ConfigureDefaultStringFilter(str))
       );

// 管理员页面用专属配置
columns.Bound(p => p.ProductDescription)
       .Filterable(filter => filter
           .ForString(str => ViewBag.FilterService.ConfigureAdminStringFilter(str))
       );

常见问题解决

如果之前尝试独立配置时遇到了Builder不生效的问题,要注意:

  • Kendo的Builder是链式调用,确保你的配置方法要么返回Builder实例(如方案1),要么直接操作传入的Builder(如方案2、3),不要创建新的Builder对象。
  • 如果需要自定义本地化文本,直接在配置方法里修改对应的字符串即可,不用每个页面单独设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:54:48