Kendo Grid服务端过滤时C#控制器无法获取Filter对象求助
我帮你梳理下代码里可能导致无法获取filter参数的几个关键点,一步步来解决:
1. Kendo Grid配置项的大小写问题
Kendo UI的配置项是小驼峰命名,你代码里的ServerOperation: true应该改成serverOperation: true,这个错误会直接导致服务端操作的配置不生效,进而干扰filter参数的正常传递。
2. 移除read.data函数里的多余操作
你在read的data回调里手动调用了grid.dataSource.filter(e.filter),这会重复设置过滤条件,打乱Kendo原本的参数生成逻辑。直接返回e即可,不需要额外操作:
data: function (e) { // 移除这两行多余的操作 // var grid = $("#grid").data("kendoGrid"); // grid.dataSource.filter(e.filter); console.log(e); return e; }
3. 控制器参数绑定优化
你的控制器参数里,[DataSourceRequest] DataSourceRequest filter的命名容易混淆,而且完全不需要单独声明pageSize、skip等参数——DataSourceRequest对象已经包含了分页、过滤、排序等所有服务端操作的参数。另外,因为你用POST请求且发送的是JSON格式,需要给DataSourceRequest加上[FromBody]特性,确保ASP.NET能正确解析JSON参数:
// 修改后的控制器方法 public JsonResult GetAllPartnersContactDetails1([FromBody][DataSourceRequest] DataSourceRequest request) { var objPartnersModel = new PartnersModel(); // 直接使用request内置的Skip和Take属性 var dataSet = objPartnersModel.GetAllPartnersContactDetails() .Skip(request.Skip) .Take(request.PageSize) .ToList(); var recordCount = objPartnersModel.GetAllPartnersContactDetails().Count(); DataSourceResult result = new DataSourceResult() { Data = dataSet, Total = recordCount }; return Json(result, JsonRequestBehavior.AllowGet); }
4. 确认必要的依赖与配置
确保你的项目已经引用了Kendo.Mvc.dll,并且在Web.config里注册了Telerik的模型绑定器:
<system.web> <httpHandlers> <add path="*" verb="*" type="Kendo.Mvc.HttpHandler.KendoHttpHandlerFactory, Kendo.Mvc" /> </httpHandlers> </system.web> <system.webServer> <handlers> <add name="KendoHttpHandler" path="*" verb="*" type="Kendo.Mvc.HttpHandler.KendoHttpHandlerFactory, Kendo.Mvc" /> </handlers> </system.webServer>
同时在Global.asax里注册Telerik的模型绑定器(ASP.NET MVC项目):
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); // 注册Kendo数据源请求模型绑定器 ModelBinders.Binders.Add(typeof(DataSourceRequest), new DataSourceRequestModelBinder()); }
5. 合并重复的filterable配置
你在Grid配置里重复写了两次filterable,这会导致后面的配置覆盖前面的,虽然不直接影响参数传递,但可能导致过滤UI异常,建议合并成一个:
filterable: { mode: "row", operators: { string: { contains: 'containsStringFilter', eq: 'eqStringFilter', neq: 'neqStringFilter', isnull: 'isnullStringFilter', isnotnull: 'isnotnullStringFilter', isempty: 'isemptyStringFilter', isnotempty: 'isnotemptyStringFilter', startswith: 'startswithStringFilter', doesnotcontain: 'doesnotcontainStringFilter', endswith: 'endswithStringFilter', isnullorempty: 'isnulloremptyStringFilter', isnotnullorempty: 'isnotnulloremptyStringFilter', } }, messages: { and: "And", or: "Or", info: "ShowItems" } },
做完这些修改后,重新测试:打开浏览器控制台查看POST请求的Payload,确认filter参数已正确序列化;然后在控制器打断点,检查request.Filters是否有值。
内容的提问来源于stack exchange,提问作者Hardik Masalawala

