kendo ui网格过滤器不区分大小写

时间:2013-08-07 16:22:00

标签: .net filtering odata kendo-grid case-insensitive

我正在尝试为kendo网格启用不区分大小写的过滤(服务器端)。有没有人知道如何将过滤器(toupper等)注入过滤器以启用不区分大小写的过滤?

背景:

我删除了一个kendo网格来使用来自控制器(EntitySetController,.NET 4.5)的数据,所有这些似乎都运行良好。内联编辑,服务器分页,添加新行等

要使用knockout启用不区分大小写的过滤,我只需构建过滤器,并将过滤器文本和字段包装在tolower中(如建议的here)。我还没有找到使用kendo元素自定义过滤器的方法。

控制器:

public class CategoriesController : EntitySetController<Category, int>
{
    public override IQueryable<Category> Get()
    {
        return _repository.Find().OrderBy(c => c.Name);
    }
}

创建数据源:

var serviceBaseUrl = "api/Categories",
    dataSource = new kendo.data.DataSource({
        type: "odata",
        transport: {
            read: {
                url: serviceBaseUrl,
                dataType: "json"
            }
        },
        schema: {
            // omitted for brevity
        },
        serverFiltering: true,
        serverPaging: true,
        pageSize: 10
});

网格创建:

$("#grid").kendoGrid({
    dataSource: dataSource,
    pageable: true,
    filterable: {
        extra: false,
        operators: {
            string: {
                contains: "Contains",
            }
        }
    },
    columns: [
        // omitted for brevity
    ]
});

2 个答案:

答案 0 :(得分:8)

基于完全缺乏回应,我猜很少有其他人遇到这个问题,并没有看到我最终提出的明显解决方案。为了防止其他一些可怜的灵魂像我一样陷入困境,这就是我想出来的。

数据源上的传输对象需要一个名为parameterMap的函数。在那里,做类似以下的事情:

parameterMap: function (data, type) {
    if (type == "read") {
        if (nameFilter) { // pull nameFilter from a viewmodel or wherever
            data.filter = {
                field: "tolower(Name)",
                operator: "contains",
                value: nameFilter.toLowerCase()
            };
        }

        var newData = kendo.data.transports.odata.parameterMap(data);
        delete newData.$format; // not currently supported by webapi.
        return newData;
    }
},

我为了这个答案做了一些简化,所以如果这个例子被打破了,那么道歉。我尽力让它真正发挥作用。

答案 1 :(得分:3)

通过下载代码为所有操作执行服务器端 https://github.com/telerik/kendo-examples-asp-net

并更改QueryableExtensions.cs 功能过滤器

到这个

    private static IQueryable<T> Filter<T>(IQueryable<T> queryable, Filter filter)
    {
        if (filter != null && filter.Logic != null)
        {
            // Collect a flat list of all filters
            var filters = filter.All();

            // Get all filter values as array (needed by the Where method of Dynamic Linq)
            var values = filters.Select(f => f.Value is string ? f.Value.ToString().ToLower() : f.Value).ToArray();

            //Add toLower() for all filter Fields with type of string in the values 
            for (int i = 0; i < values.Length; i++)
            {
                if (values[i] is string)
                {
                    filters[i].Field = String.Format("{0}.ToString().ToLower()", filters[i].Field);
                }
            }
            // Create a predicate expression e.g. Field1 = @0 And Field2 > @1
            string predicate = filter.ToExpression(filters);


            // Use the Where method of Dynamic Linq to filter the data
            queryable = queryable.Where(predicate, values);
        }

        return queryable;
    }