我使用带有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'?这样我可以避免创建重复的集线器,但我以这种方式重复推送调用。
答案 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>
如果不清楚,或者似乎缺少某些东西,请告诉我。