SignalR $ .connection未定义

Dan*_*Jr. 29 javascript asp.net-mvc jquery 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")
Run Code Online (Sandbox Code Playgroud)

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

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

我只是想找出我可能做错的任何可能的解释.首先十分感谢.

Mad*_*han 60

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

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

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

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

当然,@ Layout.cshtml是如此周到,可以添加@Scripts.Render("~/bundles/jquery")<body>标签的底部.

这是正在发生的事情.

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

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

此时,您的自定义代码将运行.但是你的代码在某个时刻,等待body.onloaddocument.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 */ *@
}
Run Code Online (Sandbox Code Playgroud)

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

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

希望这可以帮助.


Dan*_*Jr. 10

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

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

@Scripts.Render("~/bundles/jquery") 
Run Code Online (Sandbox Code Playgroud)

在视图的底部,脚本部分位于该部分下方.

@RenderSection("scripts", required:false)
Run Code Online (Sandbox Code Playgroud)

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

@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")
}
Run Code Online (Sandbox Code Playgroud)

我的视图上的包装器,以便在加载包后包含它们.我假设我没有加载所有必要的jquery,因为它现在有效.

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