2009-04-07 1 views
1

Я пытаюсь создать простой сеанс ajax с помощью JQuery и ASP.NET. Мой код работает так:Ошибка переполнения стека при использовании JQuery/ASP.NET для простого чата ajax

  1. При загрузке страницы он обновляет DIV в «Chatbox» с просьбой к странице messages.aspx, который обрабатывает получение новых сообщений из базы данных и пинает автоматическое обновление с SetTimeout().
  2. Когда пользователь нажимает кнопку отправки, он добавляет сообщение в базу данных внутри кода message.aspx page_load.

Я получаю ошибку переполнения стека с самого начала, когда начинается таймаут, и я не уверен, что это может вызвать это? Это может быть кеширование? Возможно, код в messages.aspx не может завершить работу за эти 5 секунд? Любая помощь будет оценена!

Кроме того, я не беспокоился о SQL-инъекциях, но b/c Я просто пытался заставить его работать с простым кодом.

Вот мой код:

сторона клиента:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

    <html xmlns="http://www.w3.org/1999/xhtml" > 
    <head runat="server"> 
     <title>Untitled Page</title> 
     <script src="jquery.js" type="text/javascript"></script> 
     <script type="text/javascript"> 
      $(document).ready(function() { 
       refreshChat(); 
       $("#btnSend").click(function() { 
        addMessage();    
       }); 
       return false; 
      }); 

      function refreshChat() 
      { 
       $.get("messages.aspx", function(data) { 
        $("#chatbox").empty(); 
        $("#chatbox").prepend(data); 
       }); 
       setTimeout(refreshChat(), 5000); 
      } 

      function addMessage() 
      { 
       $.get("messages.aspx", {usr: $("#usr").val(), msg: $("#msg").val()}); 
      } 
     </script> 
    </head> 
    <body> 
     <form id="form1" runat="server"> 

      <div id="input"> 
       username: <input type="text" name="usr" id="usr" /><br /> 
       message:<br /> 
       <textarea id="msg" name="msg" rows="5" cols="30"></textarea><br /><br /> 
       <input type="button" id="btnSend" name="btnSend" value="Send" /> 
      </div> 

      <div id="chatbox"></div> 

     </form> 
    </body> 
    </html> 

сторона сервера:

using System; 
using System.Data.SqlClient; 
using System.Configuration; 
using System.Collections; 
using System.IO; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 

public partial class messages : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    {  
     SqlConnection conn = 
      new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=F:\\Chatter\\App_Data\\messages.mdf;Integrated Security=True;User Instance=True"); 
     conn.Open(); 

     string sql; 
     SqlCommand comm; 

     if (Request["usr"] != null) 
     { 
      string user = Request["usr"].ToString(); 
      string message = Request["msg"].ToString(); 
      sql = "insert into messages (usr, msg, [date]) values ('" 
       + user + "', '" + message + "', '" + DateTime.Now + "')"; 
      comm = new SqlCommand(sql, conn); 
      comm.ExecuteNonQuery(); 
     } 

     sql = "select top 5 usr, msg from messages order by [date] desc"; 
     comm = new SqlCommand(sql, conn); 
     SqlDataReader dr = comm.ExecuteReader(); 

     while (dr.Read()) 
     { 
      Response.Write(dr["usr"].ToString() + ": <br/>" + dr["msg"] + "<br/><br/>"); 
     } 
     dr.Close(); 

     conn.Close(); 
    } 
} 

ответ

6

Функция javascript refreshChat рекурсивно вызывает себя. Измените код на:

 function refreshChat() 
     { 
      $.get("messages.aspx", function(data) { 
       $("#chatbox").empty(); 
       $("#chatbox").prepend(data); 
      }); 
      setTimeout(refreshChat, 5000); 
     } 
+0

+1: David M также верен, но мне нравится ваше решение, не используя javascript eval. –

+0

Оба из них работали, вы, ребята, потрясающие. Благодаря обоим. – ryanulit

3

Вам нужно обернуть вызов функции в вашем SetTimeout в кавычках, в противном случае он оценивается немедленно, вызывая бесконечную рекурсию и переполнение стека:

setTimeout("refreshChat()", 5000); 
Смежные вопросы