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

使用Razor Page时Kendo Grid无法绑定数据的问题求助

问题排查与解决方案

核心问题分析

你的代码存在两个关键问题导致Grid无法渲染数据:

1. 数据类型不匹配(编译错误)

MyModel里的Age是decimal类型,但Controller初始化数据时给它赋了字符串值(比如Age= "32"),这会直接导致编译失败,接口根本无法正常返回数据(你说浏览器调试显示接口返回JSON,大概率是代码笔误,实际应该用数字赋值)。

2. Kendo Grid Ajax数据源的格式要求

Kendo Grid的Ajax数据源默认期望接收包装后的JSON结构(包含Data字段存放数据数组、Total字段存放总条数),而你直接返回了原始数据数组,Grid无法识别;或者可以显式关闭服务器端操作,让Grid直接处理数组。


修复步骤

步骤1:修复Controller中的数据类型错误

把Controller里Age的赋值改成数字类型:

[HttpGet]
public IActionResult GetData() {
    List<MyModel> data = new()
    {
        new() { Name= "testName1", Address= "Address 1", Age= 32}, // 去掉引号,用数字
        new() { Name= "testName2", Address= "Address 2", Age= 12 },
        new() { Name= "testName3", Address= "Address 3", Age= 34 },
    };
    // 方案1:返回Kendo要求的包装格式(推荐,支持后续分页/过滤扩展)
    return Json(new { Data = data, Total = data.Count });
    // 方案2:如果不需要分页/过滤,直接返回数组,但要在Grid配置中关闭ServerOperation
    // return Json(data);
}

步骤2:调整Grid的DataSource配置

如果用方案1(返回包装格式),保持现有DataSource配置即可;如果用方案2(直接返回数组),需要添加ServerOperation(false):

.DataSource(dataSource => dataSource
    .Ajax()
    .ServerOperation(false) // 关闭服务器端操作,直接处理客户端数组
    .Read(read => read.Action("GetData", "MyData"))
)

步骤3:移除冗余配置(可选)

Grid的DataSource中Model配置可以省略,因为已经指定了泛型MyModel,Kendo会自动映射属性:

// 删掉这段冗余代码
.Model(model =>
{
    model.Field(c => c.Name);
    model.Field(c => c.Address);
    model.Field(c => c.Age);
})

步骤4:验证路由与页面访问

确保你访问的是/MyData/Index,因为路由默认规则是{controller}/{action},如果访问Home/Index,Grid的Read请求会指向/Home/GetData,而你的GetData接口在MyDataController中。


完整修复后的代码示例

修复后的Controller

namespace Mynamespace.Controllers
{
    public class MyDataController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
        [HttpGet]
        public IActionResult GetData() {
            List<MyModel> data = new()
            {
                new() { Name= "testName1", Address= "Address 1", Age= 32},
                new() { Name= "testName2", Address= "Address 2", Age= 12 },
                new() { Name= "testName3", Address= "Address 3", Age= 34 },
            };
            return Json(new { Data = data, Total = data.Count });
        }
    }
}

修复后的Razor页面

@addTagHelper *, Kendo.Mvc

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>MyTitle</title>
    <link href="https://kendo.cdn.telerik.com/2023.1.301/styles/kendo.default-v2.min.css" rel="stylesheet" />
    <script src="https://kendo.cdn.telerik.com/2023.1.301/js/jquery.min.js"></script>
    <script src="https://kendo.cdn.telerik.com/2023.1.301/js/kendo.all.min.js"></script>
</head>
<body>
    <div>
        @(Html.Kendo().Grid<Mynamespace.Models.MyModel>()
            .Name("MyKendoGrid")
            .Columns(columns =>
            {
                columns.Bound(c => c.Name).Title("Full Name");
                columns.Bound(c => c.Address).Title("Address");
                columns.Bound(c => c.Age).Title("Age");
            })
            .DataSource(dataSource => dataSource
                .Ajax()
                .Read(read => read.Action("GetData", "MyData"))
            )
            .HtmlAttributes(new { style = "height: 550px;" })
        )
    </div>
</body>
</html>

额外检查点

  • 打开浏览器控制台,查看是否有JavaScript错误(比如Kendo脚本加载失败、数据解析错误)
  • 确认GetData接口返回的JSON格式正确,没有语法错误
  • 验证Grid的Read请求URL是否正确(可以在Network面板中查看请求地址)

内容的提问来源于stack exchange,提问作者Desichele

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 08:52:31