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>
二、其他排查方向
如果修改名称后问题仍存在,试试这些步骤:
- 检查特定行的模型数据:
- 在控制器的
SalesByLocDepartment_Read方法中,打印对应LocCode的所有数据,查看是否有ID为空、重复,或者数值字段(比如TakingsToday)出现NaN、null等异常值。这些异常数据会导致Kendo Grid渲染失败。
- 在控制器的
- 查看浏览器控制台错误:
- 打开F12开发者工具,切换到
Console标签,看是否有JavaScript错误(比如“无法找到元素”“初始化失败”),这些错误会直接指向问题根源。
- 打开F12开发者工具,切换到
- 简化模板排查:
- 暂时移除TabStrip,直接在DetailTemplate中渲染Grid,看是否是TabStrip的初始化顺序问题导致的崩溃。
- 检查Kendo版本兼容性:
- 确保你使用的Kendo UI版本和ASP.NET Core版本兼容,旧版本可能存在嵌套网格的渲染BUG,尝试升级到最新稳定版。
内容的提问来源于stack exchange,提问作者B.Hawkins
相关产品推荐
相关产品推荐

