ASP.NET MVC中Kendo Grid带参数时过滤条件无法传递至服务端
问题诊断与修复步骤
1. 移除数据源中冗余的columns配置
你的Kendo Grid配置里,dataSource节点下重复定义了columns,这会干扰字段的参数映射,导致过滤条件无法正确生成。直接删除dataSource内的columns配置即可。
2. 调整请求配置与参数映射
推荐使用POST请求处理复杂的过滤/排序参数,避免GET请求的URL长度限制与模型绑定问题,同时修正请求格式:
$("#grid").kendoGrid({ dataSource: { transport: { read: { url: "/Client/GetClientAccount", type: "POST", dataType: "json", contentType: "application/json; charset=utf-8", // 必须添加,确保POST请求体格式正确 }, parameterMap: function(data, type) { // 合并自定义参数与Kendo的请求参数,统一序列化为JSON字符串 data.partyId = $(".clientnumber-text").text().trim(); return JSON.stringify(data); } }, serverPaging: true, serverSorting: true, serverFiltering: true, pageSize: 20, schema: { data: "Data", total: "Total" } }, columns: [ { field: "Description", filterable: false, title: "Description", width: "200px" }, { field: "InvoiceNumber", title: "InvoiceNumber", width: "120px", template: "#if(TransactionType && InvoiceNumber && InvoiceNumber.trim() != '' && InvoiceNumber != '0') {#" + "<a style='cursor: pointer;' " + "id='#=InvoiceNumber#' " + "onclick='downloadDoc(\"#=InvoiceNumber#\", #=getHeaderMenuId()#, \"#=SourceSystem#\")' " + "name='#=InvoiceNumber#'>#=InvoiceNumber#</a>" + "#} else {# #=InvoiceNumber# #} #" }, ], pageable: true, sortable: true, filterable: true });
3. 修正控制器方法的参数绑定
将控制器改为POST请求,并添加[FromBody]确保参数被正确解析:
[HttpPost] public JsonResult GetClientAccount([FromBody] DataSourceRequest request) { try { // 从request的额外参数中获取partyId,或直接在parameterMap中合并后作为request的属性传递 string partyId = request.Request.Params["partyId"]; using (var client = GetWebClient(WebClientContentType.JSON)) { string clientApiResponse = client.DownloadString(new Uri(_webApiUrl + "/api/Client/GetClientAccountinfo/" + partyId)); var rawResponse = JsonConvert.DeserializeObject<string>(clientApiResponse); ClientAccountJsonViewModel clientInfo = JsonConvert.DeserializeObject<ClientAccountJsonViewModel>(rawResponse); if (clientInfo?.Data == null || !clientInfo.Data.Any()) { return Json(new DataSourceResult { Data = new List<ClientAccountInvoice>(), Total = 0 }, JsonRequestBehavior.AllowGet); } var clientAccs = clientInfo.Data .Select(data => new ClientAccountInvoice { Description = data.InvoiceDescription, InvoiceNumber = data.InvoiceNumber ?? "" }) .AsQueryable(); var result = clientAccs.ToDataSourceResult(request); return Json(result, JsonRequestBehavior.AllowGet); } } catch (Exception ex) { // 日志记录 return Json(new DataSourceResult { Data = new List<ClientAccountInvoice>(), Total = 0 }, JsonRequestBehavior.AllowGet); } }
4. 验证核心匹配规则
- 确保
ClientAccountInvoice类的InvoiceNumber属性为公共字符串类型,与前端field名称完全一致(大小写敏感)。 - 若坚持使用GET请求,需配置
parameterMap将Kendo的过滤参数转换为ASP.NET MVC能识别的查询字符串格式:
parameterMap: function(data, type) { if (type === "read") { var params = kendo.data.transports.odata.parameterMap(data); params.partyId = $(".clientnumber-text").text().trim(); return params; } return data; }
同时控制器方法保持HttpGet,无需[FromBody]。
额外提示
当前代码是先拉取全部数据到本地再做过滤分页,属于客户端模拟服务端操作。若要实现真正的服务端处理,需将过滤、排序参数传递给远程API,由API完成数据筛选后返回分页结果。
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

