【问题标题】:SignalR and MVC 5 partial viewsSignalR 和 MVC 5 部分视图
【发布时间】:2017-05-09 02:31:10
【问题描述】:

大家好,我对 Asp SignalR 有以下问题。我想与管理员和用户聊天。我有 1 个带有两个 div 的视图(!用于管理员,1 个用于用户),我通过检查用户来显示或隐藏它们。到目前为止一切顺利,一切正常!管理员和用户都可以获得必要的 div 并可以交换消息 - red div admin, blue div user.。看一下代码,我会解释哪里出了问题。

<div class="Admin" id="divMessageAdmin" style="background-color:red;">
    <div class="welcome"></div><br />
    <div id="divWaitingUser"></div><br />
    <input id="txtMessage" type="text" />
    <input id="btnSendMessage" type="button" value="Send" />
    <div id="divAdminMessage"></div>
</div>

<div class="User" id="divMessageUser" style="background-color:blue;">
    <div class="welcome"></div><br />
    <input id="txtUserMessage" type="text" />
    <input id="btnSendUserMessage" type="button" value="Send" />
    <div id="divUserMessage"></div>
</div>

    <input id="hUserId" type="hidden" />
    <input id="hId" type="hidden" />
    <input id="hUserName" type="hidden" />
    <input id="hGroup" type="hidden" />

@section scripts {
    <script src="~/Scripts/jquery-1.10.2.min.js"></script>
    <script src="~/Scripts/jquery.signalR-2.2.1.min.js"></script>
    <script src="~/signalr/hubs" type="text/javascript"></script>

    <script>
        $(function () {
           var objHub = $.connection.chatHub;
           loadClientMethods(objHub);
           $.connection.hub.start().done(function () {
               loadEvents(objHub);
           });
       });

       function loadEvents(objHub) {

           var name = '@HttpContext.Current.User.Identity.Name';
           objHub.server.connect(name);
           //alert(name);

           $('#btnSendMessage').click(function () {
               var msg = $("#txtMessage").val();
               if (msg.length > 0) {
                   var username = $('#hUserName').val();
                   document.getElementById('txtMessage').value = "";
                   // <<<<<-- ***** Return to Server [  SendMessageToGroup  ] *****
                   objHub.server.sendMessageToGroup(username, msg);
               }
           });

           $('#btnSendUserMessage').click(function () {
              // alert("wrks");
               var msg = $("#txtUserMessage").val();
               if (msg.length > 0) {
                   var username = $('#hUserName').val();
                   document.getElementById('txtUserMessage').value = "";
                   // <<<<<-- ***** Return to Server [  SendMessageToGroup  ] *****
                   objHub.server.sendMessageToGroup(username, msg);
               }
           });

           $("#txtMessage").keypress(function (e) {
               if (e.which == 13) {
                   $('#btnSendMessage').click();
               }
           });
       }

        function loadClientMethods(objHub) {

           objHub.client.getMessagesAdmin = function (userName, message) {
                   $(".txtMessage").val('');
                   $('#divAdminMessage').append('<div><p>' + userName + ': ' + message + '</p></div>');
                   var height = $('#divAdminMessage')[0].scrollHeight;
                   $('#divAdminMessage').scrollTop(height);
           }

           objHub.client.getMessagesUser = function (userName, message) {
               $("#txtMessage").val('');
               $('#divUserMessage').append('<div><p>' + userName + ': ' + message + '</p></div>');
               var height = $('#divUserMessage')[0].scrollHeight;
               $('#divUserMessage').scrollTop(height);
           }

           objHub.client.onConnected = function (id, userName, UserID, userGroup, flag) {
               alert(flag);
               var strWelcome = 'Welcome' + +userName;
               $('.welcome').append('<div><p>Welcome:' + userName + '</p></div>');
               $('#hId').val(id);
               $('#hUserId').val(UserID);
               $('#hUserName').val(userName);
               $('#hGroup').val(userGroup);
               if ( flag == "1") {
                   $("#divMessageUser").hide();
                   $("#divMessageAdmin").show();
               }
               else {
                   $("#divMessageUser").show();
                   $("#divMessageAdmin").hide();
               }
           }
       }
    </script>
}

问题是,我希望这两个 div 位于单独的部分视图中。这就是我正在尝试的。在页面的开头,我检查用户是否经过身份验证,如果是,我会在 ChatController 中触发 [ChildActionOnly] 操作方法:

<h2>Chat</h2>
@{
    if (!User.Identity.IsAuthenticated)
    {
        @Html.Partial("_UnauthenticatedUserForm");
    }
    else
    {
        Html.RenderAction("AuthenticatedUsersChat");
    }
}

以及我在控制器中的操作方法

[ChildActionOnly]
public ActionResult AuthenticatedUsersChat()
{
    AppContext db = new AppContext();
    User user = db.Users.Single(usr => usr.Email == User.Identity.Name);
    int isAdmin = user.AdminCode;
    if (isAdmin == 0)
    {
        return PartialView("_UserChatPartial");
    }
    else
    {
        return PartialView("_AdminChatPartial");
    }
}

这很有效,部分视图以我想要的方式返回。在这两个部分视图中,我只移动了 div!部分管理员:

<div class="Admin" id="divMessageAdmin" style="background-color:red;">
    <div class="welcome"></div><br />
    <div id="divWaitingUser"></div><br />
    <input id="txtMessage" type="text" />
    <input id="btnSendMessage" type="button" value="Send" />
    <div id="divAdminMessage"></div>
</div>

和用户部分

<div class="User" id="divMessageUser" style="background-color:blue;">
    <div class="welcome"></div><br />
    <input id="txtUserMessage" type="text" />
    <input id="btnSendUserMessage" type="button" value="Send" />
    <div id="divUserMessage"></div>
</div>

但不知何故,只有管理员才能看到这些消息。用户可以发送消息(管理员接收),但用户看不到他或管理员的消息 - result。我根本看不到任何逻辑,为什么只有用户看不到消息。如果您有任何想法,请帮助我。提前致谢 !

我在中心类中的消息方法

public void SendMessageToGroup(string userName, string message)
{
    if (UsersList.Count != 0)
    {
        var strg = (from s in UsersList where (s.Email == userName) select s).First();
        MessageList.Add(new MessageInfo { UserName = userName, Message = message, UserGroup = strg.UserGroup });
        string strgroup = strg.UserGroup;
        Clients.Group(strgroup).getMessagesAdmin(userName, message);
        Clients.Group(strgroup).getMessagesUser(userName, message);
    }
}
// End SendMessage

以及hub中的连接方式

public void Connect(string userName)
{
        //if freeflag==0 ==> Busy
        //if freeflag==1 ==> Free

        //if tpflag==0 ==> User
        //if tpflag==1 ==> Admin

    var id = Context.ConnectionId;
    string userGroup = "";

    AppContext db = new AppContext();
    var userInfo = (from m in db.Users
                    where m.Email == HttpContext.Current.User.Identity.Name
                    select new { m.UserId, m.Email, m.AdminCode, m.FirstName, m.LastName }).FirstOrDefault();

    try
    {
        if ((int)userInfo.AdminCode == 0)
        {
            var strg = (from s in UsersList where (s.tpflag == "1") && (s.freeflag == "1") select s).First();
            userGroup = strg.UserGroup;
            strg.freeflag = "0";
            //now add USER to UsersList
            UsersList.Add(new User { ConnectionId = id, UserId = userInfo.UserId, Email = userName, UserGroup = userGroup, freeflag = "0", tpflag = "0", });
            var flag = (from s in UsersList where (s.Email == userName) select s.tpflag); 
            Groups.Add(Context.ConnectionId, userGroup);
            Clients.Caller.onConnected(id, userName, userInfo.UserId, userGroup, flag);
        }
        else
        {
            UsersList.Add(new User { ConnectionId = id, UserId = userInfo.UserId, Email = userName, UserGroup = userInfo.AdminCode.ToString(), freeflag = "1", tpflag = "1" });
            var flag = (from s in UsersList where (s.Email == userName) select s.tpflag); 
            Groups.Add(Context.ConnectionId, userInfo.AdminCode.ToString());
            Clients.Caller.onConnected(id, userName, userInfo.UserId, userInfo.AdminCode.ToString(), flag);
        }
    }
    catch
    {
        Clients.Caller.NoExistAdmin();
    }
}

【问题讨论】:

  • 您错过了 chatHub 服务器端资源。
  • 我已经编辑了帖子。我没有添加集线器方法,因为我没有看到关系,因为我只将 html 标记移动到部分视图。如果一切都在 1 视图中正常工作,当我移动 div 时,消息仅附加到 admin div,用户仍然可以发送消息,但无法显示。

标签: asp.net-mvc signalr partial-views signalr.client


【解决方案1】:

听起来您的“蓝色”用户不在您要发送到的组 strgroup 中。在SendMessageToGroup 方法中给这一行设置一个断点并检查它。

if ((int)userInfo.AdminCode == 0) 中的代码也很奇怪,为什么要从UsersList 得到First 然后再添加呢?这里可能是个例外?

【讨论】:

  • 你是对的,用户以某种方式被添加到一个组中,我只是在我的两个 div 中使用了相同的类并且有 1 个:“Clients.Group(strgroup).getMessages(userName, message );"在我的集线器中。这些是我所做的唯一更改,但仍然对它发生的原因感到有些困惑。我没有足够的声誉来标记您的答案,但是谢谢!它帮助了我:)
  • *用户未加入群组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多