ASP.NET Core 5中Ajax提交数据后KendoUI SignalR Grid不更新问题
问题描述
有一个绑定了SignalR的KendoUI Grid,通过inline或incell方式更新数据时Grid运行正常,但通过Ajax提交表单到控制器更新数据时,Grid不会同步变更。
原本的实现逻辑是将Hub注入控制器,操作完成后调用对应推送方法,示例代码:
await _fixtureHub.Clients.All.SendAsync("update", model);
期望通知所有客户端更新数据,Grid自动刷新,但实际未生效,需要排查问题。
修复方案
- 推送实体类型不匹配
你Grid的SignalR数据源Read方法返回的是ViewGridFixtures类型,但是控制器推送用的是Fixture类型,Kendo Grid的SignalR客户端监听方法要求接收的实体结构必须和Read返回的结构完全一致,结构不匹配时Grid会直接忽略推送消息,不会更新数据源。
修复示例:
// 新增操作完成后 var fixture = await _fixture.CreateAsync(model); // 查询对应的视图实体再推送 var viewFixture = await _viewFixtures.GetByIdAsync(fixture.Id); await _fixtureHub.Clients.All.SendAsync("create", viewFixture); // 更新操作同理 var fixture = await _fixture.UpdateAsync(model); var viewFixture = await _viewFixtures.GetByIdAsync(fixture.Id); await _fixtureHub.Clients.All.SendAsync("update", viewFixture);
- Hub注入方式错误
ASP.NET Core SignalR不允许直接注入Hub类本身来发送消息,必须通过IHubContext<FixtureHub>来发送消息,直接注入Hub类调用SendAsync不会生效。
修复示例:
// 替换控制器的注入逻辑 private readonly IHubContext<FixtureHub> _fixtureHubContext; public YourController(IHubContext<FixtureHub> fixtureHubContext) { _fixtureHubContext = fixtureHubContext; } // 发送消息时使用IHubContext await _fixtureHubContext.Clients.All.SendAsync("create", viewFixture);
- 日期字段格式匹配问题
你的Grid Schema中定义了Created_Date和Commencement_Date是date类型,推送的实体中这两个字段如果是字符串格式,需要符合Kendo UI的日期解析规则,否则会触发schema校验失败,忽略更新。
需要确保推送的视图实体中日期字段类型和Grid定义的类型一致,或者在推送前统一格式化日期为可识别的字符串格式。 - 可选降级方案
如果不需要全客户端实时同步,也可以在Ajax请求的success回调中手动调用Grid数据源的read方法刷新当前页面的Grid:
success: function (result) { if(result.success){ $("#fixture_grid").data("kendoGrid").dataSource.read(); } }
内容的提问来源于stack exchange,提问作者Yanayaya
相关产品推荐
相关产品推荐

