У меня есть модальное всплывающее окно, которое при щелчке извлекает частичное представление для объекта, внутри него у меня есть еще одно частичное представление, содержащее чат для этого конкретного объекта. При открытии чат запускается просто отлично и отображает все последние сообщения. Я также могу отправлять сообщения, и я вижу, что метод сервера был вызван для обновления всех сообщений. У меня есть еще одна страница, которая представляет собой всего лишь одну страницу, которая может делать то же самое (например, чат).
Однако, когда я отправляю сообщения, открытое модальное окно не получает вызов сервера для клиентского метода, но все остальные страницы делают это. Я понятия не имею, что может быть не так, поэтому любая помощь будет высоко оценена. Код выглядит следующим образом:
Центр событий:
[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();
}
}
Код для обновления и отправки сообщений:
[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 для частичного просмотра _chat (другая страница идентична, за исключением того факта, что carID = 1 вместо Model.carID):
$(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.");
});
}
Я был бы рад предоставить больше моего кода, если это необходимо, заранее спасибо за любую помощь, интернет-люди!
РЕДАКТИРОВАТЬ:
по какой-то причине мне не пришло в голову, что могут быть помехи между моим другим методом сигнализатора-концентратора. Но я также использую signalr для доставки уведомлений в реальном времени, используя этот код:
в голове моего layout.cshtml:
<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 каждый раз, когда происходит что-то важное. Итак, теперь, когда я знаю, в чем проблема, как мне ее решить? Я мог бы разместить уведомление-скрипт в конце страницы, но поскольку модальное содержимое загружается по щелчку, концентратор сообщений будет открыт ПОСЛЕ того, как соединение с концентратором уже запущено, что сделает мои попытки определить метод бесполезным.
Кто-нибудь знает, что мне делать? Несколько концентраторов с разными подключениями?