我在我的一个mvc网站上构建了一个ajax聊天。一切工作正常。我正在使用轮询。在特定的时间间隔,我使用$ .post从db获取消息。但有一个问题。使用$ .post检索的消息不断重复。这里是我的JavaScript代码和控制器方法。ASP.NET MVC ajax聊天
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()});
}
一切工作absloutely完美。但我有一些消息重复。第一次加载页面我正在检索数据并调用GetMessages()函数。我正在加载第hdnLastMsgRec第一次加载页面的值,并且此字段的值由javascript设置。
我认为消息因异步调用而不断重复。我不知道,可能你们可以帮我解决这个问题。
或者您可以提出更好的实现方法。
我很好奇你正在使用什么样的投票。 – Ciel 2010-04-19 20:35:01