SignalR 传输到不同的视图

SignalR transmit to different views

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

这是我的场景:

我在视图 A 中按下一个按钮,然后想在视图 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 文档。

抱歉,我花了一秒钟才找到您的问题。我将所有 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);
    };

});

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