2016-12-23 7 views
1

Эй, ребята, у меня есть следующая проблема с Asp SignalR. Я хочу поговорить с админами и пользователями. У меня есть 1 View с двумя divs (! Для Admin и 1 для пользователей), которые я показываю или скрываю, проверяя пользователя. Пока все хорошо, все работает! Администраторы и пользователи получают необходимые div и могут обмениваться сообщениями - red div admin, blue div user.. Взгляните на код, и я объясню, где у меня проблема.SignalR и MVC 5 частичных изображений

<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 были отделены Частично. Это то, что я пытаюсь. В начале моей страницы я проверить, если пользователь прошел проверку подлинности, если я огонь способ действий [ChildActionOnly] в моем ChatController:

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

это работает, и частичные представления возвращаются так, как я хочу. В обоих частичных представлениях я перемещал divs ТОЛЬКО! Администратор Частичное:

<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> 

и UserPartial

<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 

и способа подключения концентратора

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

Вы пропустили источники на стороне сервера chatHub. –

+0

Я отредактировал сообщение. Я не добавил методы хаба, потому что я не вижу отношения, так как я перемещаю только теги html в частичные представления. Если все в 1 View работает, когда я перемещаю div, сообщения добавляются только в div admin, пользователь все равно может отправлять сообщения, но не может отображать их. –

ответ

0

Похоже, ваш «синий» пользователь не входит в группу strgroup которой ты Повторите попытку отправки. Установите точку останова на эту строку в методе SendMessageToGroup и проверьте ее.

Также странный код в if ((int)userInfo.AdminCode == 0) Почему нужно получить First от UsersList, а затем добавить к нему еще раз? Может быть здесь исключение?

+1

Вы были правы, пользователь был каким-то образом добавлен в группу, я просто использовал одни и те же классы в обоих моих div и имел 1 сингл: «Clients.Group (strgroup) .getMessages (имя пользователя, сообщение); в моем хабе. Это единственные изменения, которые я сделал, но все же немного запутался в том, почему это произошло. У меня недостаточно репутации, чтобы отметить ваш ответ, но спасибо! Это помогло мне :) –

+1

* пользователь не был добавлен в группу –