【问题标题】:Calling Javascript method from Controller in SignalR with MVC 5使用 MVC 5 从 SignalR 中的控制器调用 Javascript 方法
【发布时间】:2014-07-13 02:20:48
【问题描述】:

我正在尝试将 SignalR 实现到一个简单的 MVC 5 项目中。我已经通过this tutorial 工作过,它可以工作,但我现在正试图从一个单独的控制器调用一个集线器方法。

我有一个名为 Generate.cshtml 的视图,带有这个标记和 Javascript:

<script type="text/javascript">    
    $(function() {
        var myHub = $.connection.ContosoChatHub;

        myHub.client.writeMessageToScreen = function(message) {
            $('#messages').append(message);
        };               
    });
</script>

<input type="text" id="msg" />
<input type="button" id="broadcast" value="broadcast" />

<ul id="messages" class="round">
</ul>

中心类是

[HubName("ContosoChatHub")]
public class ContosoChatHub : Hub
{
    public void NewContosoChatMessage(string message)
    {
        Clients.All.NewMessage(message);
    }
}

然后在我的控制器中,我想调用 writeMessageToScreen 方法——可以直接调用它,也可以通过集线器类调用。

我读过我可以直接调用 Javascript 方法

    public ActionResult Generate()
    {
        var context = GlobalHost.ConnectionManager.GetHubContext<ContosoChatHub>();

        context.Clients.All.writeMessageToScreen("Test");

        return View();
    }

但这不起作用,并且没有任何内容写入屏幕。它也没有抛出任何错误,它只是没有做任何事情。

有人知道发生了什么吗?有没有更好的方法从 Controller 调用 Hub 方法?

【问题讨论】:

标签: c# javascript asp.net-mvc signalr asp.net-mvc-5


【解决方案1】:

您没有启动连接 更新:

在你的中心类

public class ContosoChatHub : Hub
{
    public static NewContosoChatMessage(string message)
    {
     var notifyContext = GlobalHost.ConnectionManager.GetHubContext<ContosoChatHub >();
        notifyContext.Clients.All.NewMessage(message);
    }
}

然后在你的控制器中

public ActionResult Generate()
    {
        ContosoChatHub.NewContosoChatMessage("Test");

        return View();
    }
$(function() {
        var myHub = $.connection.ContosoChatHub;
        $.connection.hub.start();
        myHub.client.writeMessageToScreen = function(message) {
            $('#messages').append(message);
        };               
    });

这应该适合你

【讨论】:

  • 我添加了 $.connection.hub.start().done(function () { myHub.server.runMe(); });这在我的 ConosotoChatHub 类中执行了一个“runMe()”函数,这一切似乎都有效。但是我的Controller类中的方法还是不行,还是没有执行writeMessageToScreen方法。
  • 我在集线器类中收到一个错误,即“无法在静态上下文中访问非静态属性“客户端””。我认为我不能将 Hub 方法设为静态。
猜你喜欢
  • 2015-03-03
  • 2016-04-08
  • 2012-08-27
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多