SignalR $ .connection未定义

时间:2012-06-26 00:00:54

标签: javascript jquery asp.net-mvc signalr

我承认,我不知道我在做什么。

我正在尝试学习如何使用SignalR,我几乎逐字地在线跟踪各种样本,我无法粘贴$ .connection未定义。我正在使用MVC 4.0并尝试使用nuget下载的signalR js文件或来自示例项目的文件。这些是我的脚本参考。

@Scripts.Render("~/Scripts/jquery-1.7.2.min.js")
@Scripts.Render("~/Scripts/knockout-2.0.0.js")
@Scripts.Render("~/Scripts/jquery.signalR.js")
@Scripts.Render("~/signalr/hubs")

脚本似乎加载 - 我甚至在它们开始时发出警报,但是$ .connection总是未定义的。

在一个奇怪的事件中,我有一个不同的项目,我正在尝试使用不同的jQuery库,它使用$。并且该对象始终未定义。

我只是想找出我可能做错的任何可能的解释。非常感谢提前。

5 个答案:

答案 0 :(得分:53)

我今天遇到了同样的问题。

你的回答指出了我正确的方向,因为我有完全相同的脚本加载设置。

我按照以下顺序将所有脚本标记放在页面顶部(头部)。

  • JQuery的
  • SignalR
  • / signalr /集线器
  • MY-的script.js

当然,@ Layout.cshtml非常周到,可以在@Scripts.Render("~/bundles/jquery")代码的底部添加<body>

以下是发生的事情。

在此配置中,当页面加载时,它会按照指定的顺序加载head标记中的所有脚本。

所以它加载JQuery,然后是SignalR,它设置$.connection然后自动生成的集线器脚本设置$.connection.hubName,然后设置网站的自定义脚本。

此时您的自定义代码会运行。但在某些时候您的代码会在访问body.onload之前等待document.onReady$.connection

当此事件触发时,布局模板在body标记末尾为您添加的脚本包也会下载并执行。此捆绑包再次具有jquery库....它会重置$上的所有SignalR设置,现在您的$.connection已不再定义。

如何解决

轻松修复,确保不加载JQuery两次,一次在SignalR之前,一次在SignalR之后。我将所有脚本移动到捆绑后加载并修复了问题。这里的最佳做法是使用模板提供的“脚本”部分。

@section scripts{
    @*/* load your scripts here. You can exclude jQuery, 
      coz it's already in the template */ *@
}

所以这根本不是SignalR错误......

那是我生命中的两个小时......我永远不会回来......

希望这有助于。

答案 1 :(得分:9)

我解决了这个问题。我知道我做了什么,但我不知道为什么它确实有效。

我在_Layout.cshtml视图的顶部引用了主jquery库(版本1.7.2),但没有引用任何其他jquery脚本。我注意到默认情况下在布局视图中正在加载

@Scripts.Render("~/bundles/jquery") 

位于视图底部,脚本部分位于该部分下方。

@RenderSection("scripts", required:false)

我进一步更改了我的脚本引用,如上所示,并将上面问题中显示的脚本引用放在

@section scripts
{    
   @Scripts.Render("~/Scripts/jquery.signalR-0.5.1.js")
   @Scripts.Render("~/Scripts/jquery.color.js")
   @Scripts.Render("~/signalr/hubs")
   @Scripts.Render("~/Scripts/blasht.signalr.js")
}

在我的视图上包装,以便在加载包之后包含它们。我假设我没有加载所有必要的jquery,因为现在它可以工作。

现在,如果我能弄清楚这是如何适用于我的其他项目的。

答案 2 :(得分:3)

这可行的原因是因为加载了javascript文件的顺序。如果你在加载jquery之前尝试加载jquery.signalR-0.5.1.js,那么你将面对$ .connection undefined因为要注册这个jquery应该先加载。在_Layout.cshtml模板中,脚本按顺序加载

@Scripts.Render("~/bundles/jquery")

@RenderSection("scripts", required: false)

因此,在您的任何视图中,您可以在脚本部分下加载信号器,这应该可以正常工作。

答案 3 :(得分:2)

我有同样的问题。 对我来说,我在页面中包含了2次jquery,后来又在布局中包含了jquery。 删除其中一个解决了问题。

希望有所帮助

答案 4 :(得分:0)

这发生在我身上,因为我在加载~/signalr/hubs脚本之前动态加载了jquery.signalR-1.1.4.js脚本。

动态加载时,不会出现错误,但如果我将~/signalr/hubs的输出粘贴到我的chrome dev工具中,则会收到错误消息VM1047:18 Uncaught Error: SignalR: SignalR is not loaded. Please ensure jquery.signalR-x.js is referenced before ~/signalr/hubs. at <anonymous>:18:15 at <anonymous>:300:2