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

如何在SignalR Hub外部更新绑定SignalR的Telerik Kendo Grid?

解决SignalR外部调用刷新Kendo Grid的问题

我来帮你搞定这个问题——你直接调用context.Clients.All.read()没效果,是因为Kendo的SignalR数据源并不是靠直接触发read方法来更新UI的,它依赖的是Push事件来同步数据变化。咱们换两种靠谱的方式来实现:

方法一:在Hub里封装推送方法(推荐)

先在你的DownloadrHub中添加一个专门用来广播新增数据的方法,让它生成Kendo Grid能识别的推送格式:

public void BroadcastNewDownload(DownloaderViewModel newDownloadItem)
{
    // 构造Kendo要求的Push消息,type为"create"代表新增数据
    var pushMessage = new 
    {
        type = "create",
        data = newDownloadItem
    };
    // 给所有客户端发送推送
    Clients.All.push(pushMessage);
}

然后在Hub外部需要触发更新的地方,调用这个封装好的方法:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<Hubs.DownloadrHub>();
// 假设你已经获取到了新增的DownloaderViewModel实例
hubContext.Clients.All.BroadcastNewDownload(yourNewDownloadItem);

这样客户端的Grid会自动接收到Push事件,直接新增对应的行,不需要手动刷新。

方法二:直接在外部构造Push消息发送

如果不想修改Hub代码,也可以直接在外部构造Kendo需要的Push格式,直接调用客户端的push方法:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<Hubs.DownloadrHub>();
var newItem = // 你的新增DownloaderViewModel对象
// 按照Kendo要求的格式组装消息
var pushPayload = new 
{
    type = "create", // 可选值:create/update/destroy,对应增删改操作
    data = newItem
};
// 给所有客户端推送消息
hubContext.Clients.All.push(pushPayload);

几个关键注意点

  • 你的Grid Schema里设置了model.Id("FileSize"),这里要确保FileSize是唯一标识,如果有相同大小的文件,会导致Grid更新异常,建议换成真正唯一的字段(比如文件路径LocalFile或者专门的ID字段)。
  • 确认你的DownloaderViewModel的属性和Grid绑定的列完全匹配,不然数据可能无法正确渲染。
  • 检查SignalR的连接状态,确保hubStart这个Promise已经成功完成,不然客户端接收不到推送消息。

内容的提问来源于stack exchange,提问作者AmirHossein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:35:09