【发布时间】:2010-03-21 08:19:08
【问题描述】:
我在我的一个 mvc 网站中建立了一个 ajax 聊天。一切正常。我正在使用轮询。在一定的时间间隔内,我使用 $.post 从数据库中获取消息。但有一个问题。使用 $.post 检索到的消息不断重复。这是我的 javascript 代码和控制器方法。
var t;
function GetMessages() {
var LastMsgRec = $("#hdnLastMsgRec").val();
var RoomId = $("#hdnRoomId").val();
//Get all the messages associated with this roomId
$.post("/Chat/GetMessages", { roomId: RoomId, lastRecMsg: LastMsgRec }, function(Data) {
if (Data.Messages.length != 0) {
$("#messagesCont").append(Data.Messages);
if (Data.newUser.length != 0)
$("#usersUl").append(Data.newUser);
$("#messagesCont").attr({ scrollTop: $("#messagesCont").attr("scrollHeight") - $('#messagesCont').height() });
$("#userListCont").attr({ scrollTop: $("#userListCont").attr("scrollHeight") - $('#userListCont').height() });
}
else {
}
$("#hdnLastMsgRec").val(Data.LastMsgRec);
}, "json");
t = setTimeout("GetMessages()", 3000);
}
这是我获取数据的控制器方法:
public JsonResult GetMessages(int roomId,DateTime lastRecMsg)
{
StringBuilder messagesSb = new StringBuilder();
StringBuilder newUserSb = new StringBuilder();
List<Message> msgs = (dc.Messages).Where(m => m.RoomID == roomId && m.TimeStamp > lastRecMsg).ToList();
if (msgs.Count == 0)
{
return Json(new { Messages = "", LastMsgRec = System.DateTime.Now.ToString() });
}
foreach (Message item in msgs)
{
messagesSb.Append(string.Format(messageTemplate,item.User.Username,item.Text));
if (item.Text == "Just logged in!")
newUserSb.Append(string.Format(newUserTemplate,item.User.Username));
}
return Json(new {Messages = messagesSb.ToString(),LastMsgRec = System.DateTime.Now.ToString(),newUser = newUserSb.ToString().Length == 0 ?"":newUserSb.ToString()});
}
一切都完美无缺。但是我有些消息被重复了。第一次加载页面时,我正在检索数据并调用 GetMessages() 函数。我在第一次加载页面时加载字段 hdnLastMsgRec 的值,并且在该字段的值由 javascript 设置之后。
我认为由于异步调用,消息会不断重复。我不知道,也许你们能帮我解决这个问题。
或者您可以提出更好的实施方法。
【问题讨论】:
-
我很好奇您使用的是哪种投票方式。
标签: asp.net-mvc ajax chat