ASP.NET MVC5中Kendo UI Grid刷新页面数据丢失问题求助
根据你描述的情况——首次加载正常,URL刷新后仅显示表格框架,重启程序才恢复——结合你的代码来看,我整理了几个最可能的原因和对应的解决方案:
1. 缺失详情模板导致Grid初始化失败
你的Grid代码里设置了.ClientDetailTemplateId("Test"),但我没看到对应的<script type="text/x-kendo-template" id="Test"></script>模板定义。Kendo Grid找不到这个模板时,会在初始化过程中静默失败,导致数据无法渲染。
解决方案:
- 如果不需要详情展开功能,直接删除
.ClientDetailTemplateId("Test")这一行; - 如果需要详情模板,添加对应的模板代码,比如:
<script type="text/x-kendo-template" id="Test"> <div class="user-detail"> <p>用户名:#= UserName #</p> <p>角色:#= Fakerole.FakeRoleName #</p> </div> </script>
2. ViewData["defaultCategory"]刷新时未赋值
你的Grid数据源模型里,Fakerole字段的默认值依赖ViewData["defaultCategory"]:
model.Field(p => p.Fakerole).DefaultValue(ViewData["defaultCategory"] as FakeRoleViewModel);
首次加载页面时,你的控制器Action可能设置了这个ViewData,但刷新页面时,如果对应Action(比如MyUser/Index)没有重新赋值,ViewData["defaultCategory"]会为空,导致数据源初始化异常。
解决方案:
在页面对应的控制器Action中,确保每次请求都重新设置ViewData["defaultCategory"]:
public ActionResult Index() { // 从数据库获取默认角色,确保每次请求都能拿到有效数据 var defaultRole = db.FakeRoles.FirstOrDefault(); ViewData["defaultCategory"] = defaultRole != null ? new FakeRoleViewModel { FakeRoleId = defaultRole.FakeRoleId, FakeRoleName = defaultRole.FakeRoleName } : null; return View(); }
3. Kendo UI脚本引用不完整或顺序错误
你的代码只引用了kendo.aspnetmvc.min.js,但这个脚本依赖Kendo的核心库(比如kendo.all.min.js)。首次加载时可能因为其他页面的缓存引用生效,但刷新后核心库未加载,导致Grid无法正常初始化。
解决方案:
调整脚本引用顺序,确保先加载Kendo核心库,再加载ASP.NET MVC适配脚本:
<script src="http://cdn.kendostatic.com/2013.3.1119/js/kendo.all.min.js"></script> <script src="http://cdn.kendostatic.com/2013.3.1119/js/kendo.aspnetmvc.min.js"></script>
4. 调试Read Action确认数据返回正常
刷新页面时,Grid会触发EditingCustom_Read请求获取数据,你需要确认这个Action是否正常返回数据:
- 打开浏览器开发者工具(F12),切换到Network面板,查看刷新时是否有
EditingCustom_Read的请求; - 检查请求的状态码(应该是200)和返回的JSON数据是否包含用户列表;
- 在
EditingCustom_Read方法中添加断点或日志,确认方法被调用,且数据正确返回:
public ActionResult EditingCustom_Read([DataSourceRequest]DataSourceRequest request) { // 日志记录,确认请求到达 System.Diagnostics.Debug.WriteLine("EditingCustom_Read 被调用"); var users = db.Users.Select(u => new UserViewModel { UserId = u.Id, UserName = u.UserName, password = u.PasswordHash, // 注意:实际项目不要返回明文密码! ConfirmPassword = u.PasswordHash, Fakerole = new FakeRoleViewModel { FakeRoleId = u.FakeRoleId, FakeRoleName = u.FakeRole.FakeRoleName } }).ToList(); return Json(users.ToDataSourceResult(request)); }
5. 检查ServerOperation设置的影响
你的数据源设置了.ServerOperation(false),意味着客户端处理分页、排序等操作,EditingCustom_Read需要返回全部数据。如果你的Action返回的是分页后的数据,会导致Grid显示为空。
确认EditingCustom_Read中没有手动分页,直接返回完整的用户列表即可。
按照上面的步骤排查,应该能解决刷新后无数据的问题。如果还有疑问,可以贴出控制器Action的代码和浏览器Network面板的请求详情,我再帮你进一步分析。
内容的提问来源于stack exchange,提问作者Alejandro1991

