2013-08-07 48 views
3

我试图为剑道网格启用大小写不敏感的过滤(服务器端)。有谁知道一种方法将tolower(toupper等)注入过滤器以启用不区分大小写的过滤功能吗?kendo ui网格过滤器不区分大小写

背景:

我放弃了剑道格栅从控制器(EntitySetController,.NET 4.5)消耗的数据和一切似乎很好地工作。内联编辑,服务器分页,添加新行等。

要启用基因敲除的大小写不敏感的过滤,我只需构建过滤器文本和字段包裹在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 
    ] 
}); 

回答

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; 
    } 
}, 

我做了一些简化这个答案的目的,因此,如果道歉那个例子坏了。我尽我所能使它实际上起作用。

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; 
    } 
做的所有操作服务器端