繁体   English   中英

在部分视图中未调用SignalR客户端方法

[英]SignalR client-method not being called in partialview

我有一个模态弹出窗口,单击该弹出窗口可检索对象的局部视图,在该对话框中,我具有另一个局部视图,其中包含该特定对象的聊天记录。 打开聊天功能后,它就可以正常启动并显示所有最新消息。 我还可以发送消息,并且看到调用了server方法来更新所有消息。 我还有另一个页面,只有一个页面,可以完成相同的操作(即聊天)。

但是,当我发送消息时,开放模式不会使服务器调用客户端方法,而其他所有页面都可以。 我不知道可能出什么问题,因此将不胜感激。 代码如下:

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();
    }
}

用于更新和发送消息的代码:

[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.");
    });
}

如果有必要,我很乐意提供更多代码,在此先感谢互联网人士的任何帮助!

编辑:

由于某种原因,我的其他信号发送器-hub方法之间可能没有干扰。 但是我也使用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。 所以,现在我知道问题出在哪里了,我该如何解决呢? 我可以将通知脚本放在页面的末尾,但是在单击时加载模态内容时,将在集线器连接启动后打开messagehub,这使我尝试定义方法无效。

有人知道我该怎么做吗? 具有不同连接的多个集线器?

由于partialview是在整个站点加载后加载的,因此这意味着我试图在集线器初始化后向SignalR添加方法,这只有在您创建了hubproxy并使用hubproxy.on(event)添加事件侦听器的情况下才有可能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM