我在我的一個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