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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:15:03