首页 > 解决方案 > SignalR Group 消息应用程序,创建组消息框导致刷新

问题描述

我正在使用 SignalR 创建一个聊天应用程序,我知道我的代码导致会话刷新,但是我看不到它是在哪里导致的。每当我点击我的提交输入标签时,它都会像私人聊天一样完成创建聊天框的步骤(有效)。但是,它不会调用服务器的 sendGroupMessage 方法来发送聊天。一旦它脱离了 javascript 端的 createGroupChatWindow 函数,它将刷新并断开用户连接。

关于为什么会发生这种情况的任何建议或关于我应该正确做什么的指示?如果代码难以阅读,我深表歉意。PS 我正在使用数据库来存储用户及其 ConnectionID。

编辑:运行应用程序时我没有收到任何错误。它只是导致在脚本完成时调用 onDisconnected。当我检查它是基于服务器还是基于客户端的断开连接时,它告诉我客户端启动了断开连接。

C# 聊天中心:

public void createGroupID(string GroupName, int OwnerID)
{
    Groups.Add(Context.ConnectionId, GroupName);
    string query = "INSERT INTO dbo.Collective (GroupName, GroupOwnerID) Select '" + GroupName + "','" + OwnerID + "'";
    ConnC.ExecuteQuery(query);
}

public void getGroupID(string GroupName, string members)
{
    string query = "Select * From dbo.Collective Where GroupName = '" + GroupName + "'";
    int ID = 0;
    int.TryParse(ConnC.GetColumnVal(query, "GroupID"), out ID);

    int mem;
    int.TryParse(members, out mem);

    mapMembers(mem, ID, GroupName);
}

public void mapMembers(int members, int groupid, string groupName)
{
    var item = "";
    if (DisconnectUsers.Count(x => x.UserID == members) == 0)
    {
        List<Borg> memberConnection = ConnectedUsers.Where(u => u.UserID == members).ToList();
        item = memberConnection.Select(u => u.ConnectionId).ToString();
        Groups.Add(item, groupName);
        //Clients.Group(item, groupName);
    }
    else
    {
        List<Borg> memberConnection = DisconnectUsers.Where(u => u.UserID == members).ToList();
        item = memberConnection.Select(u => u.ConnectionId).ToString();
        Groups.Add(item, groupName);
        //Clients.Group(item, groupName);
    }

    if (members != 0)
    {
        string query = "Insert Into dbo.CollectiveMapping (GroupID, MemberID) Select '" + groupid + "'," + members;
        ConnC.ExecuteQuery(query);
    }
}

public void sendGroupMessage(string GroupName, string message)
{
    try
    {
        string strfromUserId = (ConnectedUsers.Where(u => u.ConnectionId == Context.ConnectionId).Select(u => u.UserID).FirstOrDefault()).ToString();
        int _fromUserId = 0;
        int.TryParse(strfromUserId, out _fromUserId);
        string getgroupid = "Select * From dbo.Collective where GroupName = '" + GroupName + "'";
        int groupid = 0;
        int.TryParse(ConnC.GetColumnVal(getgroupid, "GroupID"), out groupid);

        string countMember = "Select * From dbo.CollectiveMapping Where GroupID = " + groupid + " and MemberID <> " + _fromUserId;
        List <GroupMapping> GroupMap = ConnC.getGroupMappings(countMember);

        List<Borg> FromUsers = ConnectedUsers.Where(u => u.UserID == _fromUserId).ToList();
        List<Borg> ToGroup = (List<Borg>)ConnectedUsers.Where(u => GroupMap.Any(m => m.UserID == u.UserID));

        var UName = Context.User.Identity.Name;
        var item = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);

        if (FromUsers.Count != 0 && ToGroup.Count() != 0)
        {
            foreach (var ToUser in ToGroup)
            {
                // send to                                                                              
                //Chat Title
                Clients.Group(GroupName).addMessage(FromUsers[0].UserName, message);
                //Clients.Group(GroupName).sendGroupMessage(GroupName, FromUsers[0].UserName, GroupName, message);
                //Clients.Client(ToUser.ConnectionId).sendPrivateMessage(GroupName, FromUsers[0].UserName, GroupName, message);
            }

            foreach (var FromUser in FromUsers)
            {
                // send to caller user                                                                                
                //Chat Title
                Clients.Group(GroupName).addMessage(FromUsers[0].UserName, message);
                //Clients.Group(GroupName).sendGroupMessage(GroupName, FromUsers[0].UserName, GroupName, message);
                //Clients.Client(FromUser.ConnectionId).sendPrivateMessage(GroupName, FromUsers[0].UserName, GroupName, message);
            }
            // send to caller user
            //Clients.Caller.sendPrivateMessage(_toUserId.ToString(), FromUsers[0].UserName, message);
            //ChatDB.Instance.SaveChatHistory(_fromUserId, _toUserId, message);
            Messages _MessageDetail = new Messages { FromUserID = _fromUserId, FromUserName = FromUsers[0].UserName, UserID = groupid, UserName = GroupName, Message = message };

            var TUserName = GroupName;
            var FUserName = FromUsers[0].UserName;

            string Query = "Insert Into dbo.HiveMessages (FromUserID, FromUserName,GroupID, UserName, Message, TimeSent)  Select '" + _fromUserId + "','" + FUserName + "','" + groupid + "','" + GroupName + "','" + message + "', GetDate()";
            ConnC.ExecuteQuery(Query);
            AddMessageinCache(_MessageDetail);
        }
    }
    catch { }
    }

Javascript:

$("#submit").click(function () {
    var t = $("#groupname").val();
    var i = $("[id$=hidCurrentID]").val();
    e.server.createGroupID(t, i);
    //var g = e.server.getGroupID(t).val();
    OpenGroupChatWindow(e,i,t);
}),    
function createGroupChatWindow(e, i, t, n, s) {
    s = "Welcome to the start of your Group.",
    n = $("[id$=hidCurrentUser]").val(),
    $("#chatd").append('<div id="' + t + '"></div>'),
    $('#user-list :selected').each(function (i, selectedelement) {
        var mem = $(selectedelement).val();
        //var mem = members[i].val();
        e.server.getGroupID(t, mem);
        o = $('<a id="' + i + '" class="col-sm-12 bg-succ" >' + t + "<a>"),
        $(o).dblclick(function () { var i = $(this).attr("id"); a != i && OpenGroupChatWindow(e, i, t) });
        $("#group").append(o);
        $("#" + t).chatbox({
            id: t, 
            title: t, 
            user: mem, 
            offset: getNextOffset(), 
            width: 200, 
            messageSent: function (t, n, s) { 
                e.server.sendGroupMessage(t, s), 
                TypingFlag = !0 
            },
            boxClosed: function (e) {
                $("#" + e).remove(); 
                var i = showList.indexOf(e); 
                if (-1 != i) {
                    showList.splice(i, 1), diff = config.width + config.gap;
                    for (var t = i; t < showList.length; t++) 
                        offset = $("#" + showList[t]).chatbox("option", "offset"), $("#" + showList[t])
                            .chatbox("option", "offset", offset - diff)
                }
            }
        });
    });
    $("#" + t).siblings().css("position", "relative"),
    $("#" + t).siblings().append('<div id="typing_' + i + '" style="width:20px; height:20px; display:none; position:absolute; right:14px; top:8px"><img height="20" src="' + srp + 'images/pencil.gif" /></div>'),
    $("#" + t).siblings().find("textarea").on("input", function (t) { 1 == TypingFlag && e.server.sendUserTypingRequest(i), TypingFlag = !1 });
    var a = parseInt($("[id$=hidCurrentID]").val()), o = i;// e.server.requestLastMessage(a, o)
}

HTML:

<div id="chat-window">
    <div id="popup-title-bar" style="bottom:0; width: 200px;"> 
        <span class="col-sm-9 txt-primary" style="color: white;">
            <strong>Online Members</strong>
        </span>
        <div id="min-button">
            <i>&plusmn;</i>
        </div>
    </div>
    <div id="popup-box" style="display: none; overflow-y:auto;">
        <div id="on" style="display: block; overflow-y:auto;">
            <span>-Online Users-</span>
        </div>
        <div id="group">
            <a id ="new-group" class="col-sm-12 bg-succ">-New Group-</a>
        </div>
        <div id="off">
            <span>-Offline Users-</span>
        </div>
    </div>
</div>
<div id="group-control" style="display: none;">
    <div id="group-title-bar">
        <span class="col-sm-9 txt-primary" style="color: white; width: 375px;">
            <strong>Create A New Group</strong>
        </span>
        <div id="close-group-control" style="font: 25px; right: 0px;">&#x274c;</div>
    </div>
    <div class="group-input">
        <div id="group-name" style="float:left;">
            <label for="groupname" style="display:block">
                <strong>Name your Group</strong>
            </label>
            <textarea placeholder="-Group Name Here-" id="groupname" name="groupname" maxlength="50" style="display: block; resize: none;width: 200px; height:35px; border:3px solid #428bca; padding:4px; font-family:'Times New Roman';"></textarea>
        </div>
        <div id="submit-group" style="float:right;text-align:center;">
            <label for="submit" style="display:block; right:0px; width:200px; height:35px; text-align:center;" >
                <strong>Create Group</strong>
            </label>
            <input id="submit" style="display:block; right:0px; width:200px; height:35px; text-align:center;" type="submit" name="submit" value="Submit" />
        </div>
        <div id="group-choose" style="display:block;">
            <input type="text" placeholder="Search.." style="display:block; width:200px; height:35px;" id="chosenUser" onkeyup="filterFunction()">
            <select style="display: block;" multiple="multiple" id="user-list" class="dropdown-content" name="user-list">
                <option value="" selected style="width:200px; height:35px;">-Select your Group Members-</option>
            </select>
        </div>
    </div>
</div>

标签: javascriptjqueryhtml.netsignalr

解决方案


推荐阅读