JS 客户端不调用 SignalR Hub 上的方法

Posted

技术标签:

【中文标题】JS 客户端不调用 SignalR Hub 上的方法【英文标题】:JS Client doesn't invoke Method on SignalR Hub 【发布时间】:2018-04-30 14:48:49 【问题描述】:

我有一个 MVC 项目,它有 2 个按钮和 6 个文本框。我想在集线器上调用不同的方法。

客户

$(document).ready(function () 
            var bitcoinHub = $.connection.bitcoinHub;

            $("#btnBuy").click(function () 
                var tl = document.getElementById("bitcoinBuy").value;
                var btc = document.getElementById("aBitcoin").value;
                var total = document.getElementById("aTotal").value;
                bitcoinHub.server.trade("buy",@Model.user,tl,btc,total);
            );

            bitcoinHub.client.broadcastSell = function (model) 
                //   $("#sellGrid").append("<li>"+model.Sell+"</li>");
            ;

            $("#btnSell").click(function () 
                var tl = document.getElementById("bitcoinSell").value;
                var btc = document.getElementById("sBitcoin").value;
                var total = document.getElementById("sTotal").value;
                bitcoinHub.server.trade("sell",@Model.user,tl,btc,total);
            );

            bitcoinHub.client.broadcastPurchase = function (model) 
                // $("#buyGrid").append("<li>"+model.Buy+"</li>");
            ;
            $.connection.hub.start();   );

如果我按下“btnBuy”或“btnCell”,它应该使用不同的参数调用服务器上的交易方法。

服务器

BitcoinHub(name) 类方法

 public void trade(string parametre, Users cUser, string tl, string btc, string total)
    
        switch (parametre)
        
            case "sell":
                // Do something not important here
                break;
            case "buy":
                // Do something not important here
                break;
        
    

如果我按下“btnBuy”或“btnCell”,它会通过clickeventhandler。问题是集线器上的方法不会被调用。

【问题讨论】:

我不明白我们的最后一节。能改写一下更清楚吗? 我有一个 mvc 表单。每个按钮都有 2 个按钮和 3 个文本框。当我按下第一个按钮时,它将获取 3 个文本框的值并发送到服务器端交易方法,它将用于将数据插入数据库。问题:当我按下按钮时。 Js 的 .click 事件同时工作。当我使用断点代码调用第一个 .click 代码块并跳转到其他按钮的 .click 函数时。其他问题:但在此服务器端的交易方法没有调用之后。 你也可以添加你的html吗? 其他点:您确定连接已启动吗?我会将订阅点击事件的核心移动到 $.connection.hub.start().done(function()); ); 我现在正在尝试,但我真的不知道 SignalR 语法,如果你有时间可以从 github 修复吗? github.com/kadirkalkan/PragmaLinq 【参考方案1】:

你不能像@Model.user那样在JS中使用模型。详情见Accessing MVC's model property from javascript

另外重新排列您的代码。在建立连接之前不要调用服务器上的方法:

$(document).ready(function () 
                var bitcoinHub = $.connection.bitcoinHub;           

                bitcoinHub.client.broadcastSell = function (model) 
                    //   $("#sellGrid").append("<li>"+model.Sell+"</li>");
                ;

                bitcoinHub.client.broadcastPurchase = function (model) 
                    // $("#buyGrid").append("<li>"+model.Buy+"</li>");
                ;
                $.connection.hub.start().done(function()
                    // DO not call methods on server until connection is established.
                    $("#btnBuy").click(function () 
                        var tl = document.getElementById("bitcoinBuy").value;
                        var btc = document.getElementById("aBitcoin").value;
                        var total = document.getElementById("aTotal").value;
                        bitcoinHub.server.trade("buy",@Model.user,tl,btc,total);
                    );
                    $("#btnSell").click(function () 
                        var tl = document.getElementById("bitcoinSell").value;
                        var btc = document.getElementById("sBitcoin").value;
                        var total = document.getElementById("sTotal").value;
                        bitcoinHub.server.trade("sell",@Model.user,tl,btc,total);
                );
    );   );

【讨论】:

以上是关于JS 客户端不调用 SignalR Hub 上的方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SignalR 客户端中使用 async/await 和 hub.On

Asp.Net SignalR Hub类中的操作详解

Asp.Net SignalR Hub类中的操作详解

SignalR--Web客户端

SignalR的简单使用()

ASP.NET SignalR 系列之源码与总结