2016-05-01 14 views
0

私はクリックするとオブジェクトのpartialviewを取得するモーダルポップアップがあります。この中には、この特定のオブジェクトのチャットを含むpartialviewがあります。チャットを開くと、チャットが始まり、すべての最新のメッセージが表示されます。私もメッセージを送信することができ、すべてのメッセージを更新するためにサーバーメソッドが呼び出されたことがわかります。同じページ(つまりチャット)を行うことができるページが1つだけあります。partialviewでSignalRクライアントメソッドが呼び出されていません

しかし、メッセージを送信すると、開いたモーダルはクライアントメソッドへのサーバー呼び出しを取得しませんが、他のすべてのページはそれを行います。何が間違っているかわからないので、どんな助けも高く評価されます。コードは以下の通りである:

eventHub:

[HubName("eventHandler")] 
public class eventHub : Hub 
{ 
    private ApplicationDbContext db = new ApplicationDbContext(); 
    public static void SendMessages() 
    { 
     IHubContext context = GlobalHost.ConnectionManager.GetHubContext<eventHub>(); 
     context.Clients.All.updateMessages(); 
    } 

    public static void SendNotices() 
    { 
     IHubContext context = GlobalHost.ConnectionManager.GetHubContext<eventHub>(); 
     context.Clients.All.updateNotices(); 
    } 
} 

メッセージを更新して送信するためのコード:_chat partialview(他のページの

[HttpPost] 
public ActionResult SendChatMessage(string message, int chatCarID, int chatUserID) 
{ 
    comment chatMessage = new comment() { type = commentType.chat, carID = chatCarID, userID = chatUserID, date = DateTime.Now.ToString(), text = message }; 
    db.comments.Add(chatMessage); 
    db.SaveChanges(); 
    eventHub.SendMessages(); 
    return Content("Meddelande skickat!", "text"); 
} 

public ActionResult GetMessages(int carID) 
{ 
    var chatList = db.comments.Where(c => c.type == commentType.chat && c.carID == carID).ToList(); 
    if (chatList.Count < 1) 
    { 
     List<comment> emptyList = new List<comment>(); 
     comment emptyComment = new comment() { userID = ViewBag.serverUser.userID, writtenByUser = ViewBag.serverUser, text = "Du har inga chat-meddelanden rörande den här bilen, kolla gärna tillbaka senare!", type = commentType.chat, date = DateTime.Now.ToString() }; 
     emptyList.Add(emptyComment); 
     return PartialView("_MessageList", emptyList); 
    } 
    return PartialView("_MessageList", chatList); 
} 

クライアント側のJavaScriptはを除いて同一であります実際にはModel.carIDではなくcarID = 1):

$(function() { 
    $.connection.hub.enablelogging = true; 
    var messages = $.connection.eventHandler; 

    messages.client.updateMessages = function() { 
     console.log("New messages incoming!"); 
     getAllChats('@Url.Action("GetMessages", "base", new { carID = Model.carID })'); 
    }; 

    $.connection.hub.start().done(function() { 
     getAllChats('@Url.Action("GetMessages", "base", new { carID = Model.carID })'); 
    }); 
}); 

function getAllChats(get_url) 
{ 
    var chat_holder = $('#chatMessages'); 
    $.ajax({ 
     url: get_url, 
     contentType: 'application/html ; charset:utf-8', 
     type: 'GET', 
     dataType: 'html' 
    }).success(function (result) { 
     console.log("Retrieved new messages"); 
     chat_holder.empty().append(result); 
     var messageList = document.getElementById("messageList"); 
     messageList.scrollTop = messageList.scrollHeight; 
    }).error(function() { 
     console.log("An error occured while loading the chat-messages."); 
    }); 
} 

私はうれしいでしょうそれが必要な場合は、私のコードの多くを供給してください、事前に任意のヘルプインターネットの人々のために感謝!

EDIT:私の他のsignalr-hubmethod間の干渉があるかもしれないと私には発生していなかったいくつかの理由で

<script type="text/javascript"> 
     $(function() { 
      $.connection.hub.logging = true; 
      var notices = $.connection.eventHandler; 

      // Create a function that the hub can call to broadcast messages. 
      notices.client.updateNotices = function() { 
       console.log("Started gathering notifications"); 
       getAllNotices('@Url.Action("GetNotices", "base")') 
      }; 

      // Start the connection. 
      $.connection.hub.start().done(function() { 
       console.log("Started gathering notifications"); 
       getAllNotices('@Url.Action("GetNotices", "base")'); 
      }).fail(function (e) { 
       alert(e); 
      }); 
     }); 

     function getAllNotices(get_url) 
     { 
      var notice_holder = $('#notifications'); 
      $.ajax({ 
       url: get_url, 
       contentType: 'application/html ; charset:utf-8', 
       type: 'GET', 
       dataType: 'html' 
      }).success(function (result) { 
       notice_holder.empty().append(result); 
      }).error(function() { 

      }); 
     } 
    </script> 

と私はeventhub.sendNotices重要な何かが起こるたびに呼び出す:私のlayout.cshtmlの頭の中で

:しかし、私はこのコードを使用して、リアルタイムの通知を配信することもsignalrを使用しています。問題がどこにあるのか分かったので、どうやって解決するのですか?私はページの最後に通知スクリプトを置くことができましたが、モーダルコンテンツがクリックでロードされると、hubconnectionが既に開始された後にメッセージハブが開かれ、メソッドを無駄に定義しようとしました。

私は何をすべきか考えている人はいますか?異なる接続を持つ複数のハブ

答えて

0

サイト全体がロードされた後にpartialviewがロードされたため、ハブ初期化後にSignalRにメソッドを追加しようとしていましたが、これはcretaのhubproxyとhubproxy.on(イベント)イベントリスナーを追加します。

関連する問題