Kendo Grid服务端模式分组后搜索int类型Id报错
Kendo Grid分组后搜索int类型Id字段报错解决方法
服务端模式的Kendo Grid完成分组操作后,搜索int类型的Id字段时触发报错,报错出现在控制器返回数据列表的环节。
控制器代码:
return isGrouping ? Json(lstofToolAction.ToDataSourceResult(request), JsonRequestBehavior.AllowGet) : Json(new { Data = lstofToolAction, Total = total }, JsonRequestBehavior.AllowGet);
报错信息(已翻译):
提供的表达式应为字符串类型 参数名称: stringExpression filter
问题原因
当Grid处于分组状态时,会调用ToDataSourceResult方法处理请求,该方法默认将Id字段的搜索条件按字符串类型表达式解析,但Id是int类型,类型不匹配导致抛出参数错误。
解决方法
方法一:前端指定字段过滤类型
在Grid的列配置中,为Id字段明确设置过滤的数据类型为number,让前端发送符合类型要求的过滤请求,避免后端解析出错:
$("#grid").kendoGrid({ columns: [ { field: "Id", title: "ID", filterable: { dataType: "number" } }, // 其他列配置 ], // 分页、分组等其他配置 });
方法二:后端修正过滤条件类型
在控制器中接收DataSourceRequest后,手动遍历过滤条件,将针对Id字段的字符串类型过滤转换为数值类型处理:
var request = new DataSourceRequest(); TryUpdateModel(request); if (request.Filters != null) { foreach (var filter in request.Filters.OfType<FilterDescriptor>()) { if (filter.Member.Equals("Id", StringComparison.OrdinalIgnoreCase)) { // 将字符串值转为int类型 if (int.TryParse(filter.Value?.ToString(), out int idValue)) { filter.Value = idValue; } // 如果是模糊搜索需求,需替换为合适的数值操作符,或者自定义过滤逻辑 // 比如将Id转为字符串后进行Contains匹配,示例: // filter.Operator = FilterOperator.Contains; // filter.Value = idValue.ToString(); } } } return Json(lstofToolAction.ToDataSourceResult(request), JsonRequestBehavior.AllowGet);
方法三:全局自定义数值字段过滤处理
如果有多个数值类型字段需要处理,可以扩展ToDataSourceResult方法,统一处理数值类型字段的过滤条件转换,避免逐个字段修改的重复工作。
内容的提问来源于stack exchange,提问作者Chundya
相关产品推荐
相关产品推荐

