2016-12-23 7 views
1

ねえ私はAsp SignalRに次の問題があります。私は管理者とユーザーとチャットをしたいです。私は2つのdiv(管理者の場合は!、ユーザーの場合は1つ)を持つ1つのビューを持っています。これは、ユーザーを確認して表示または非表示にします。これまでのところとても良い、すべての作品!管理者とユーザーの両方が必要なdivを取得し、メッセージを交換できます(red div admin, blue div user.)。コードを見て、どこに問題があるのか​​を説明します。SignalRとMVCの部分図

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

私はこれらの2つの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> 

と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 

と接続方法は、あなたの「青」のユーザーはあなた」グループstrgroupにないよう

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を移動すると、メッセージはadmin divにのみ追加され、メッセージは送信できますが表示できません。 –

答えて

0

が鳴りますに送信しようとしています。 SendMessageToGroupメソッドでこの行にブレークポイントを設定し、チェックします。

if ((int)userInfo.AdminCode == 0)で奇妙なコードFirstUsersListから取得してもう一度追加する理由は?ここで例外がありますか?

+1

あなたは正しく、ユーザーは何とかグループに追加されました。私は両方の部門で同じクラスを使い、1つしか持っていませんでした。 "Clients.Group(strgroup).getMessages(userName、message);"私のハブで。これらは私が作った唯一の変更ですが、まだそれが起こった理由について少し混乱しています。あなたの答えに印を付けるほどの評判はありませんが、ありがとう!それは私を助けました:) –

+1

*ユーザーはグループに追加されませんでした –