【发布时间】:2015-08-19 14:12:00
【问题描述】:
在信号器中的消息有些问题,无法与组合作,所以当它具有这种形式时它可以工作:
Clients.All.received(new { sender = sender, message = message, isPrivate = false });
在我的项目中,我有房间,所以当我尝试向群组发送消息时,它们不会显示在页面上:
Clients.Group(chatuser.CurrentGroup).received(new { sender = sender, message = message, isPrivate = false });
这里是javascript的一小部分:
chatHub.client.received = function (message) {
viewModel.messages.push(new Message(message.sender, message.message, message.isPrivate, 'normalMessage'));
};
如果您需要查看更多代码,请告诉我,我会更新我所有的 chathub 代码并使用完整的 javascript 文件为它建模。
更新 2。 聊天用户:
public ChatUser(string group) {
CurrentGroup = group;
}
public ChatUser()
: this("Lobby")
{
}
public string nameOfGroup { get; set; }
public int authorID { get; set; }
public List<string> chatGroup { get; set; }
public string CurrentGroup { get; set; }
public string userLogin { get; set; }
public HashSet<string> ConnectionIds { get; set; }
Chathub.cs
private void SendGroupMessage(ChatUser user, string message)
{
Clients.Group(user.CurrentGroup).received(user.userLogin, message);
}
public void Send(string message)
{
var user = GetUser(Context.User.Identity.Name);
SendGroupMessage(user, message);
}
public override Task OnConnected()
{
string userName = Context.User.Identity.Name;
string connectionId = Context.ConnectionId;
var user = chatUsers.GetOrAdd(userName, _ => new ChatUser
{
userLogin = userName,
ConnectionIds = new HashSet<string>()
});
lock (user.ConnectionIds)
{
user.ConnectionIds.Add(connectionId);
// Or you might want to only broadcast this info if this
// is the first connection of the user
if (user.ConnectionIds.Count == 1)
{
Clients.Others.userConnected(userName);
}
}
return base.OnConnected();
}
public Task JoinGroup(string groupName)
{
var user = GetUser(Context.User.Identity.Name);
string connectionGrpToString = user.ConnectionIds.ToString();
//Join new Group
user.CurrentGroup = groupName;
//await
return Groups.Add(connectionGrpToString, user.CurrentGroup);
}
public Task LeaveRoom(string roomName)
{
var user = GetUser(Context.User.Identity.Name);
string connectionGrpToString = user.ConnectionIds.ToString();
var oldGroup = user.CurrentGroup;
//Tell everyone user is leaving
var message = string.Format("{0} has left.", user.userLogin);
SendGroupAlert(user, message);
//remove user from the group
//await
return Groups.Remove(connectionGrpToString, oldGroup); ;
}
重做的 Chat.js 的一小部分:
function Message(from, msg, template) {
this.from = ko.observable(from);
this.message = ko.observable(msg);
this.template = ko.observable(template);
}
chatHub.client.received = function (sender, message) {
// Add the message to the page.
viewModel.messages.push(new Message(sender, message, 'normalMessage'));
};
chat.cshtml 的视图:
<div class="col-md-12">
<div class="form-search">
<input type="text" id="txtMsg" class="input-xxlarge" disabled="disabled" placeholder="send" />
<button type="button" id="btnSend" class="btn btn-info" disabled="disabled">Send</button>
</div>
</div>
<div class="col-md-10">
<ul id="normalMessage" data-bind="foreach: messages">
<li>
<strong><span data-bind="text: from"></span>: </strong>
<span data-bind="text: message"></span>
</li>
</ul>
</div>
更新 3。
也许我错过了一些东西,但也显示了房间页面的代码以及它如何重定向我,我还发现当我选择我想加入的房间时,它会转到方法 JoinGroup 和参数 @ 987654329@ 它正确显示了我选择的内容,但是当我要发送消息后,在 user.CurrentGroup 它显示默认大厅..
Rooms.cshtml:
<div id="nav">
<div id="rooms" class="well well-small">
<ul class="nav nav-list">
<li class="nav-header">Rooms</li>
@foreach (var item in Model)
{
<li data-value=@item.Name>@Html.ActionLink("Room: " + item.Name, "Chat", "Home")</li>
}
</ul>
</div>
</div>
以及我如何在 chat.js 中加入它:
var roomKey = $(this).data('value');
chatHub.server.joinGroup(roomKey);
【问题讨论】:
-
你们是如何建立小组的?请分享您的
OnConnected方法。另外,chatuser.CurrentGroup是什么?请分享此值 -
发布您将用户分配到组的代码。
-
我已经更新了我的代码,抱歉花了这么长时间才回复,@salniro 我还有另一个显示房间列表的页面。 'chatuser.CurrentGroup' 存储我当前加入的组,我在 ChatUser 模型中声明它。
-
@AnikIslamAbhi 已经发布了 :)
-
@salniro 我发现了一个新错误,请在线程中检查。
标签: javascript asp.net-mvc asp.net-mvc-4 knockout.js signalr