2012-09-12 72 views
7

用了這個錯誤的貼2小時掙扎..

TypeError: $.connection is undefined 
[Break On This Error] 

var chatHubClient = $.connection.chatHub; 

這裏是我的Chat.cs(這是在控制器中的文件夾 - 我的猜測是這是我在做什麼錯的,但我找不到在哪裏把它或任何文件如何路由吧)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using SignalR.Hubs; 

namespace SingalrTest.Controllers 
{ 
    public class Chat 
    { 
     private readonly static Lazy<Chat> _instance = new Lazy<Chat>(() => new Chat()); 

     public static Chat Instance 
     { get { return _instance.Value; } } 
    } 

    [HubName("chatHub")] 
    public class ChatHub : Hub 
    { 
     private readonly int TimeoutInSeconds = 30; 
     private readonly Chat _chat; 

     public ChatHub() : this(Chat.Instance) { } 

     private ChatHub(Chat chat) 
     { 
      this._chat = chat; 
     } 

     public void Join(string channelName) 
     { 
      System.Diagnostics.Debug.WriteLine("Someone joined " + channelName); 
     } 
    } 
} 

,最後,在..可能_Layout.cs.html

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta charset="utf-8" /> 
     <title>@ViewBag.Title - My ASP.NET MVC Application</title> 
     <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" /> 
     <meta name="viewport" content="width=device-width" /> 

     @Styles.Render("~/Content/css") 
     @Scripts.Render("~/bundles/modernizr") 
     @Scripts.Render("~/Scripts/jquery-1.8.1.js") 
     @Scripts.Render("~/Scripts/jquery.signalR-0.5.3.js") 
     @Scripts.Render("~/signalr/hubs") 

     <script type="text/javascript"> 
      $(document).ready(function() { 
       // var chatHubClient = jQuery.connection.chatHub; 
       var chatHubClient = $.connection.chatHub; 

       $.connection.chatHub.start(function() { 
        chatHubClient.join('TEST'); 
       }); 
      }); 
     </script> 
    </head> 
    <body> 
    ... 
    </body> 
</html> 

如果我訪問/ signalr /集線器,我可以看到源生成正確。那麼我錯過了什麼?

+0

我有這個相同的問題。出於某種原因,$ .ready事件發生時未定義$ .connection。 我通過運行內聯代碼而不是就緒事件來修復它...我不知道它爲什麼會消失,雖然... –

回答

0

this,對於0.5.3版本,你必須改變連接語法:

var connection = $.hubConnection(); 

或引導用戶訪問輔助服務器

var connection = $.hubConnection("http://localhost:58416/"); 

連接到集線器:

var hub = connection.createProxy('your_hub_name'); 

還有一些更改發送和接收消息以及

希望這有助於

8

你可能已經轉移...

但這裏有一個解決方案。

您將所有腳本以正確的順序放在head標籤中。但是Visual Studio模板中的_Layout.cshtml在body標籤的末尾有以下幾行代碼。

@Scripts.Render("~/bundles/jquery") 
@RenderSection("scripts", required: false) 

這個包有jQuery庫,它在加載時覆蓋$對象。所以SignalR的這個設置中的任何'東西'現在都被覆蓋並且不可訪問。

只需在頁面中使用以下內容。

@section scripts { 
    @* Load your scripts here. (and remove jQuery, coz it's already loaded) *@ 
} 

希望這會有所幫助。

+0

真棒,非常感謝。 –

+0

雖然jquery在加載時會不會正確綁定?我寧願讓捆綁程序加載jQuery作爲捆綁包的一部分,然後重新運行signalR的東西。 –

+0

是的。你只需要加載SignalR。並確保你在jQuery之後加載它。 (腳本部分在加載jQuery腳本之後運行,腳本在默認配置之前運行..) – Madushan