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

Kendo Grid特定子网格无法显示问题(ASP.NET Core MVC)

解决Kendo Grid嵌套子网格特定行展开时崩溃的问题

根据你描述的情况——特定行展开子网格时,父级子网格(根报表)直接折叠、列和数据消失,但控制器返回数据正常,且问题固定在同一行——我遇到过类似的场景,大概率是组件名称冲突或者模型字段异常导致的,下面是具体的排查和解决方案:

一、最可能的原因:重复/非法的组件名称

Kendo UI的所有组件(Grid、TabStrip等)要求Name属性必须是全局唯一的,而且不能包含HTML ID不允许的字符(比如空格、#、.、/等)。看你当前的代码:

  • 根报表的TabStrip和Grid用了#=ID#作为名称的一部分,但如果某行的ID为空、重复,或者包含特殊字符,就会导致DOM元素ID无效,Kendo无法正确初始化组件,最终表现为网格崩溃。
  • 子报表的TabStrip和Grid也用了#=ID#,但这个ID是父级模型的ID,当多个行展开时,很可能和其他行的子组件重名,引发渲染冲突。

修复方案:确保组件名称绝对唯一且合法

修改模板中所有Kendo组件的Name属性,结合多层级的唯一标识(比如LocCode+DeptCode+ID)来生成名称,避免冲突和非法字符:

修改后的根报表模板:

<script id="SalesByLocDept_DetailTemplate" type="text/x-kendo-tmpl">
    <h4>Department Sales Summary For Location: #=LocCode# - #=LocName#</h4>
    @(Html.Kendo().TabStrip()
        .Name("sales_by_loc_tabstrip_#=LocCode#_#=ID#") <!-- 加入LocCode保证同ID下的唯一性 -->
        .Items(items => {
            items.Add()
                .Text("Department Summary")
                .Selected(true)
                .Content(@<text>
                    @(Html.Kendo().Grid<SalesSummaryByDepartmentViewModel>()
                        .Name("sales_by_loc_dept_grid_#=LocCode#_#=ID#") <!-- 重命名Grid,避免和子组件冲突 -->
                        .Scrollable()
                        .Reorderable(r => r.Columns(true))
                        .Resizable(r => r.Columns(true))
                        .ColumnMenu()
                        .Columns(columns => {
                            columns.Bound(f => f.DeptCode).Title("Department Code");
                            columns.Bound(f => f.DeptDesc).Title("Department Name");
                            columns.Bound(f => f.TakingsToday).Title("Today's Takings");
                            columns.Bound(f => f.MarginToday).Title("Today's Margin");
                            columns.Bound(f => f.TakingsMonth).Title("Month's Takings");
                            columns.Bound(f => f.MarginMonth).Title("Month's Margin");
                            columns.Bound(f => f.TakingsYear).Title("Year's Takings");
                            columns.Bound(f => f.MarginYear).Title("Year's Margin");
                            columns.Bound(f => f.TakingsToDate).Title("Takings To Date");
                            columns.Bound(f => f.MarginToDate).Title("Margin To Date");
                        })
                        .Pageable(pageable => pageable.Refresh(true).PageSizes(new int[] { 100, 150, 200 }))
                        .Sortable()
                        .Selectable()
                        .Navigatable()
                        .Filterable()
                        .ClientDetailTemplateId("SalesByLocDeptGroup_DetailTemplate")
                        .DataSource(dataSource => dataSource
                            .Ajax()
                            .Model(model => { model.Id(detail => detail.ID); })
                            .Read(read => read.Action("SalesByLocDepartment_Read", "Reporting", new { LocCode = "#=LocCode#" }))
                        ).ToClientTemplate()
                    )
                </text>);
        }).ToClientTemplate()
    )
</script>

修改后的子报表模板:

<script id="SalesByLocDeptGroup_DetailTemplate" type="text/x-kendo-tmpl">
    <h4>Group Sales Summary For Location: #=LocCode# - #=LocName#, Department: #=DeptCode# - #=DeptDesc#</h4>
    @(Html.Kendo().TabStrip()
        .Name("sales_by_loc_dept_group_tabstrip_#=LocCode#_#=DeptCode#_#=ID#") <!-- 组合LocCode+DeptCode+ID,确保全局唯一 -->
        .Items(items => {
            items.Add()
                .Text("Group Summary")
                .Selected(true)
                .Content(@<text>
                    @(Html.Kendo().Grid<SalesSummaryByGroupViewModel>()
                        .Name("sales_by_loc_dept_group_grid_#=LocCode#_#=DeptCode#_#=ID#") <!-- 重命名Grid -->
                        .Scrollable()
                        .Reorderable(r => r.Columns(true))
                        .Resizable(r => r.Columns(true))
                        .ColumnMenu()
                        .Columns(columns => {
                            columns.Bound(f => f.GroupCode).Title("Group Code");
                            columns.Bound(f => f.GroupDesc).Title("Group Name");
                            columns.Bound(f => f.TakingsToday).Title("Today's Takings");
                            columns.Bound(f => f.MarginToday).Title("Today's Margin");
                            columns.Bound(f => f.TakingsMonth).Title("Month's Takings");
                            columns.Bound(f => f.MarginMonth).Title("Month's Margin");
                            columns.Bound(f => f.TakingsYear).Title("Year's Takings");
                            columns.Bound(f => f.MarginYear).Title("Year's Margin");
                            columns.Bound(f => f.TakingsToDate).Title("Takings To Date");
                            columns.Bound(f => f.MarginToDate).Title("Margin To Date");
                        })
                        .Pageable(pageable => pageable.Refresh(true).PageSizes(new int[] { 100, 150, 200 }))
                        .Sortable()
                        .Selectable()
                        .Navigatable()
                        .Filterable()
                        .ClientDetailTemplateId("SalesByLocDeptGroupProduct_DetailTemplate")
                        .DataSource(dataSource => dataSource
                            .Ajax()
                            .Model(model => { model.Id(detail => detail.ID); })
                            .Read(read => read.Action("SalesByLocDeptGroup_Read", "Reporting", new { LocCode = "#=LocCode#", DeptCode = "#=DeptCode#" }))
                        ).ToClientTemplate()
                    )
                </text>);
        }).ToClientTemplate()
    )
</script>

二、其他排查方向

如果修改名称后问题仍存在,试试这些步骤:

  1. 检查特定行的模型数据:
    • 在控制器的SalesByLocDepartment_Read方法中,打印对应LocCode的所有数据,查看是否有ID为空、重复,或者数值字段(比如TakingsToday)出现NaN、null等异常值。这些异常数据会导致Kendo Grid渲染失败。
  2. 查看浏览器控制台错误:
    • 打开F12开发者工具,切换到Console标签,看是否有JavaScript错误(比如“无法找到元素”“初始化失败”),这些错误会直接指向问题根源。
  3. 简化模板排查:
    • 暂时移除TabStrip,直接在DetailTemplate中渲染Grid,看是否是TabStrip的初始化顺序问题导致的崩溃。
  4. 检查Kendo版本兼容性:
    • 确保你使用的Kendo UI版本和ASP.NET Core版本兼容,旧版本可能存在嵌套网格的渲染BUG,尝试升级到最新稳定版。

内容的提问来源于stack exchange,提问作者B.Hawkins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:03:00