2016-12-23 3 views
1

Hey Leute, ich habe das folgende Problem mit Asp SignalR. Ich möchte mit Admins und Benutzern chatten. Ich habe 1 Ansicht mit zwei divs (! Für den Admin und 1 für die Benutzer), die ich ein- oder ausblenden, indem ich den Benutzer überprüfe. So weit, so gut, alles funktioniert! Sowohl die Admins als auch die Benutzer erhalten die erforderlichen divs und können Nachrichten austauschen - red div admin, blue div user.. Schau dir den Code an und ich erkläre, wo ich ein Problem habe.SignalR und MVC 5 Teilansichten

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

Die Sache ist, dass ich diese zwei divs in getrennten Teilansichten sein möchte. Das ist es, was ich versuche. Zu Beginn meiner Seite überprüfe ich, ob der Benutzer authentifiziert ist, wenn es mir Feuer eine [ChildActionOnly] Aktionsmethode in meinem ChatController:

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

und meine Aktionsmethode in der Steuerung

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

das funktioniert und die Teilansichten kehren so zurück, wie ich es möchte. In beiden Teilansichten habe ich NUR die divs bewegt! Admin Teil:

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

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

aber irgendwie dann kann nur der Administrator die Nachrichten sehen. Der Benutzer kann Nachrichten senden (Admin erhält sie), aber der Benutzer kann seine oder Admins Nachrichten nicht sehen - result. Ich sehe einfach keine Logik, warum nur der Benutzer die Nachrichten nicht sehen kann. Bitte, wenn Sie irgendwelche Ideen haben, helfen Sie mir. Danke im Voraus !

meine Methode für die Nachrichten in der Nabe Klasse

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 

und die Verbindungsmethode in der Nabe

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

Sie haben chatHub serverseitige Quellen verpasst. –

+0

Ich habe den Beitrag bearbeitet. Ich habe die Hub-Methoden nicht hinzugefügt, weil ich die Beziehung nicht sehe, da ich nur HTML-Tags in die Teilansichten verschiebe. Wenn alles in 1 ist Ansicht funktioniert, wenn ich die divs verschiebe, werden die Nachrichten nur an die admin div angehängt, Benutzer kann immer noch Nachrichten senden, kann aber nicht angezeigt werden. –

Antwort

0

Klingt „blue“ Benutzer nicht in der Gruppe ist strgroup, die Sie‘ Ich versuche zu senden. Setzen Sie einen Breakpoint auf diese Linie in der SendMessageToGroup Methode und überprüfen Sie es.

Auch seltsame Code in if ((int)userInfo.AdminCode == 0) warum First von UsersList bekommen und dann noch einmal hinzufügen? Kann hier eine Ausnahme sein?

+1

Sie hatten Recht, der Benutzer wurde irgendwie zu einer Gruppe hinzugefügt, ich benutzte einfach die gleichen Klassen in meinen beiden Divs und hatte 1 Single: "Clients.Group (strgroup) .getMessages (userName, message);" in meinem Hub. Das sind die einzigen Änderungen, die ich gemacht habe, aber ich bin immer noch ein bisschen verwirrt darüber, warum es passiert ist. Ich habe nicht genug Ruf, um deine Antwort zu markieren, aber danke! Es hat mir geholfen :) –

+1

* Der Benutzer wurde NICHT zu einer Gruppe hinzugefügt –

Verwandte Themen