在部分视图中未调用 SignalR 客户端方法
SignalR client-method not being called in partialview
我有一个模态弹出窗口,单击它会检索对象的局部视图,在其中我有另一个局部视图,其中包含该特定对象的聊天。在打开聊天时,它会正常启动并显示所有最新消息。我也可以发送消息,我看到服务器方法被调用以更新所有消息。我有另一个页面,它只是一个页面,可以做同样的事情(即聊天)。
但是,当我发送消息时,打开模式不会让服务器调用客户端方法,但所有其他页面都会调用。我不知道出了什么问题,所以任何帮助都将不胜感激。代码如下:
事件中心:
[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);
}
_chat 部分视图的客户端 javascript(另一个页面相同,除了 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-hubmethod 之间可能存在干扰。但我也使用 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。那么现在我知道问题出在哪里,我该如何解决呢?我可以将通知脚本放在页面的末尾,但是当点击加载模式内容时,消息中心将在集线器连接已经启动后打开,使我尝试定义一个方法变得无用。
有人知道我应该做什么吗?具有不同连接的多个集线器?
因为部分视图是在整个站点加载后加载的,这意味着我试图在集线器初始化后向 SignalR 添加方法,这只有你创建一个集线器代理并使用 hubproxy.on( event) 添加事件侦听器。
我有一个模态弹出窗口,单击它会检索对象的局部视图,在其中我有另一个局部视图,其中包含该特定对象的聊天。在打开聊天时,它会正常启动并显示所有最新消息。我也可以发送消息,我看到服务器方法被调用以更新所有消息。我有另一个页面,它只是一个页面,可以做同样的事情(即聊天)。
但是,当我发送消息时,打开模式不会让服务器调用客户端方法,但所有其他页面都会调用。我不知道出了什么问题,所以任何帮助都将不胜感激。代码如下:
事件中心:
[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);
}
_chat 部分视图的客户端 javascript(另一个页面相同,除了 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-hubmethod 之间可能存在干扰。但我也使用 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。那么现在我知道问题出在哪里,我该如何解决呢?我可以将通知脚本放在页面的末尾,但是当点击加载模式内容时,消息中心将在集线器连接已经启动后打开,使我尝试定义一个方法变得无用。
有人知道我应该做什么吗?具有不同连接的多个集线器?
因为部分视图是在整个站点加载后加载的,这意味着我试图在集线器初始化后向 SignalR 添加方法,这只有你创建一个集线器代理并使用 hubproxy.on( event) 添加事件侦听器。