使用signalR通过1个广播更新多个视图

时间:2014-08-19 21:06:43

标签: jquery asp.net-mvc signalr

我使用带有signalR 2的MVC 5.我有一个页面,它有一个主要的布局模板,使用signalR来更新该模板的某些部分。我还在该页面上有部分视图,需要从布局模板使用的相同signalR广播刷新。基本上在模板中我有:

 var entrypush;
    $(document).ready(function () {
        entrypush = $.connection.entryHub;
        entrypush.client.entryUpdated = refreshLayout;
        $.connection.hub.start();
    });

但部分视图需要回复此相同的条目已更新'来自signalR的广播呼叫。处理这个问题的最佳方法是什么?我应该在局部视图上创建一个全新的集线器,以便我有吗?

var entrypushPV;
    $(document).ready(function () {
        entrypushPV = $.connection.entryHub;
        entrypushPV.client.entryUpdated = refreshPartialView;
        $.connection.hub.start();
    });

这似乎是一个坏主意,但我无法想到解决这个问题的方法。相反,在集线器上复制方法会更好吗?因此,我不再只是推送“entryUpdated”,而是推送“entryUpdateForLayout”'和' entryUpdateForPartialView'?这样我可以避免创建重复的集线器,但我以这种方式重复推送调用。

1 个答案:

答案 0 :(得分:1)

我想通过说我绝不是一个JavaScript向导来做这个序言,所以请一定要考虑这个问题,并根据需要进行修改。在此代码中,我在javascript文件中打开与SignalR中心的连接,然后创建在调用客户端函数时引发的事件。然后你可以在需要的地方听这个事件:

<强> hubconnection.js

$(document).ready(function () {
    var entrypush;
    entrypush = $.connection.entryHub;

    //setup event
    var event = document.createEvent('Event');
    event.initEvent('refresh', true, true);

    //define the function that is called when entrypush.client.entryUpdated is called. obj is data passed from the hub
    refresh = function (obj) {
        event.data = obj;
        document.dispatchEvent(event);
    };

    entrypush.client.entryUpdated = refresh;

    //connect to hub
    $.connection.hub.start();
});

<强> _Layout.cshtml

<head>
    //jquery + SignalR stuff...

    <script src="~/Scripts/hubconnection.js"></script>

    <script>
    document.addEventListener('refresh', function (e) {
        //do stuff with e.data here, if necessary.
    }, false);
    </script>
</head>

<强> _Partial

<script>
        document.addEventListener('refresh', function (e) {
            //do stuff with e.data here, if necessary.
        }, false);
</script>

如果不清楚,或者似乎缺少某些东西,请告诉我。