SignalR传输到不同的视图

时间:2016-07-14 12:08:35

标签: asp.net-mvc signalr

我花了很多时间试图找到一些关于如何将响应数据提供给与您发送的视图不同的视图的示例。

以下是我的情景:

我正在查看A中的按钮,而不想在View B中的所有客户端中显示警报

在一个视图中发送和接收工作正常(我找到的所有示例都是这样的)

查看A:

<button id ="test"> Some button </button>
<script src="/signalr/hubs"></script>

<script type="text/javascript">

    $(function () {
        var sender = $.connection.messagesHub;

        // this works fine but I need this function to be called in a different view
        //sender.client.updateMachinesDisplay = function (machineId) {
        //    alert(machineId);
        //};

        $.connection.hub.start().done(function () {

            console.log('connection started Main');

            $('#test').click(function () {
                sender.server.sendMachineIdToHub(@Model.MachineId);
            });
        }).fail(function (reason) {
            console.log("SignalR connection failed: " + reason);
        });
    });
</script>  

查看B(此处我想看警报信息):

        sender.client.updateMachinesDisplay = function (machineId) {
            alert(machineId);
        };

这是服务器端代码:

    public class MessagesHub : Hub
{

    [HubMethodName("sendMachineIdToHub")]
    public void SendMachineIdToHub(int machineId)
    {
        Clients.All.updateMachinesDisplay(machineId);
    }
}

也许将一些代码放到_Layout可能是一个解决方案?我试图让发送者变得全球化,但它没有用,或许我做错了。我还将尝试在SignalR文档中阅读更多内容。

1 个答案:

答案 0 :(得分:1)

抱歉,我花了一秒钟才发现你的问题。我将所有SignalR代码放入一个JS文件中,并将其放入共享的_Layout页面。

这是完整的工作代码:

集线器

[HubName("messageHub")]
public class MessageHub : Hub
{ 
    [HubMethodName("sendMachineIdToHub")]
    public void SendMachineIdToHub(int machineId)
    {
        Clients.All.updateMachinesDisplay(machineId);
    }
}

_layout

<script src="~/Scripts/jquery.signalR-2.2.0.js"></script>
<script src="~/signalr/hubs"></script>
<script src="~/Scripts/signalR.messageHub.js"></script> <!-- this is my JS File -->

signalR.messageHub.js

$(function () {
    var sender = $.connection.messageHub;

    $.connection.hub.start().done(function () {

        console.log('connection started Main');

        $('#test').click(function () {
            sender.server.sendMachineIdToHub(88);
        });
    }).fail(function (reason) {
        console.log("SignalR connection failed: " + reason);
    });

    sender.client.updateMachinesDisplay = function (machineId) {
        alert(machineId);
    };

});

我认为你试图在一个页面上使用集线器连接,它不是一个全局变量,或者不在范围内(从它的外观来看)。您为集线器连接分配的相同变量将负责从集线器发送/接收消息,因此需要在每个页面上。出于这个原因,您还需要连接到Hub。