我正在尝试为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
]
});
答案 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;
}