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

ASP.NET Core中KendoUI Grid无法排序的问题求助

问题分析与解决方案

这个问题的根源在于你用了List<object>来存储列数据——Kendo UI的ToDataSourceResult方法在处理服务器端排序、过滤这类操作时,需要明确的类型信息才能正确识别属性(比如ColumnName)。当你把匿名类型实例塞进List<object>后,运行时绑定器找不到对应的属性定义,就会抛出那个RuntimeBinderException。

解决办法很简单:改用强类型实体类来存储你的列信息,代替匿名类型和List<object>。这样Kendo就能在编译时就获取到属性的类型信息,顺利处理服务器端操作。

1. 创建强类型实体类

先定义一个和你返回数据结构匹配的类,比如叫VesselColumn:

public class VesselColumn
{
    public int Id { get; set; }
    public string ColumnName { get; set; }
    public string ColumnType { get; set; }
}

2. 修改数据接口代码

把原来的List<object>替换成List<VesselColumn>,并且在添加数据时使用这个类的实例,而不是匿名类型:

public JsonResult ReadVesselColumns([DataSourceRequest]DataSourceRequest request)
{
    // 获取实体类型
    var entityType = _context.Model.FindEntityType("Hagland.Data.Vessel");
    // 改用强类型列表
    var columns = new List<VesselColumn>();
    int colId = 0;

    foreach (var property in entityType.GetProperties())
    {
        columns.Add(new VesselColumn
        {
            Id = colId++,
            ColumnName = property.GetColumnName(),
            ColumnType = property.GetColumnType()
        });
    }

    // 现在ToDataSourceResult能正确识别属性了
    var result = columns.ToDataSourceResult(request);
    return Json(result);
}

3. 确认Grid配置无需修改

你现有的Grid代码已经正确映射了ColumnName和ColumnType字段,schema里的Id配置也没问题,所以前端代码不需要调整。

为什么这样能解决问题?因为强类型提供了清晰的属性定义,Kendo的服务器端扩展方法在处理DataSourceRequest时,能直接通过反射或表达式树访问VesselColumn的属性,而不是在运行时去猜object里有没有某个属性——这就是之前报错的核心原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:42:38