You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 14:25:17