SignalR v2无法找到方法

时间:2014-05-01 21:18:06

标签: c# asp.net-mvc signalr

我正在学习SignalR,我在Google Chrome的调试中遇到了这个错误:

Uncaught TypeError: Cannot read property 'MoveShape' of undefined

我在MVC中的集线器课程

public class MoveShapeHub : Hub
{
    public void MoveShape(int x, int y)
    {
        Clients.Caller.shapeMoved(Context.ConnectionId, x, y);
    }
}

Javascript文件

$(function () {
var hub = $.connection.MoveShapeHub;
var $shape = $('#shape');

$.extend(hub, {
    shapeMoved: function (cid, x, y) {
        if (cid !== $.connection.hub.id) {
            $shape.css({ left: x, top: y });
        }
    }
});

$.connection.hub.start().done(function () {
    $shape.draggable({
        drag: function () {
            hub.MoveShape(this.offsetLeft, this.offsetTop || 0);
        }
    });
});
});

HTML中的脚本重新添加

<script src="~/Scripts/jquery-ui-1.10.4.js"></script>
<script src="~/Scripts/jquery.signalR-2.0.3.js"></script>
<script src="/signalr/hubs"></script>
<script src="~/Scripts/Application/MoveShape.js"></script>

HTML

<div id="shape" style="width: 100px; height: 100px; background-color:#f00"></div>

2 个答案:

答案 0 :(得分:1)

尝试这样做

var hub = $.connection.moveShapeHub;

答案 1 :(得分:1)

首先,您能否向我们展示您致电MapSignalR()的启动课程?

假设你已经正确地完成了这件事,我看到的第一件事是关闭的:

var hub = $.connection.MoveShapeHub;

“/ signalr / hubs”脚本负责定义$.connection.moveShapeHub。请注意如何使用JavaScript常用的较低驼峰大小写约定moveShapeHub,而不是C#常用的Pascal大小写约定。

这意味着应该修改上面的行以使用较低的camel case约定:

var hub = $.connection.moveShapeHub;

如果您更喜欢使用Pascal案例,可以使用HubName属性。

[HubName("MoveShapeHub")]
public class MoveShapeHub : Hub

/ signalr / hubs脚本不会重新设置由HubName属性指定的名称。 http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-javascript-client#getproxy


其次,您应该将客户端集线器回调放在$.connection.moveShapeHub.client对象上,而不是直接放在$.connection.moveShapeHub上。这意味着$.extend(hub, { //...应该是$.extend(hub.client, {


您还需要为所有脚本使用应用程序根相对路径,但 / signalr / hubs除外。如果您的应用程序根目录是域的根目录,这应该不是问题,但我会将/ signalr / hubs引用更改为app root相对于安全。