none
如何用AJAX实现每条留言显示多人回复 RRS feed

  • 问题

  • 本人正在通过制作留言程序来学习ASP.net,其中一个功能是每条留言允许多人回复,我想实现的效果是:打开留言页面后只加载留言不加载回复,单击某条留言后面的“查看回复”按钮后,通过AJAX显示该条留言的所有回复。
    在论坛中找了半天,看见“层的显示问题”中“孟宪会版主”的回复,看了之后受益良多。现在我要的效果基本已经实现。
    我想问如何在document.getElementById("content" + dataID).innerHTML = x.responseText;中读出一个数据集合呢?比如回复人的昵称、回复内容、回复时间等等?
     

    <%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> System.Data.DataView CreateDataSourceByXianhuiMeng() { System.Data.DataTable dt = new System.Data.DataTable(); System.Data.DataRow dr; dt.Columns.Add(new System.Data.DataColumn("id", typeof(System.Int32))); dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String))); dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal))); dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal))); dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal))); dt.Columns.Add(new System.Data.DataColumn("计算机", typeof(System.Decimal))); for (int i = 0; i < 30; i++) { System.Random rd = new System.Random(Environment.TickCount * i); ; dr = dt.NewRow(); dr[0] =i; dr[1] = "【孟子E章】" + i.ToString(); dr[2] = System.Math.Round(rd.NextDouble() * 100, 2); dr[3] = System.Math.Round(rd.NextDouble() * 100, 2); dr[4] = System.Math.Round(rd.NextDouble() * 100, 2); dr[5] = System.Math.Round(rd.NextDouble() * 100, 2); dt.Rows.Add(dr); } System.Data.DataView dv = new System.Data.DataView(dt); return dv; } private void showData(string cid) { Response.ClearContent(); Response.Write("去查数据库,找到数据库中 " + cid + " 记录的值。"); Response.End(); } protected void Page_Load(object sender, EventArgs e) { if (!String.IsNullOrEmpty(Request.QueryString["id"])) { this.showData(Request.QueryString["id"].ToString()); return; } this.GridView1.DataSource = this.CreateDataSourceByXianhuiMeng(); this.GridView1.DataBind(); } </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <script type="text/javascript"> function getData(dataID) { if (document.getElementById("content" + dataID).style.display != "none") { document.getElementById("content" + dataID).style.display = "none" return; } else { document.getElementById("content" + dataID).style.display = "" if (document.getElementById("content" + dataID).innerHTML == "") //或者其他的内容 { var x = new createXmlHttp(); x.open("GET", "Default10.aspx?id=" + dataID, false) x.send(null); if (x.status == 200) { if (x.readyState == 4) { document.getElementById("content" + dataID).innerHTML = x.responseText; } } } } } function createXmlHttp() { var xmlhttp_request = false; try { xmlhttp_request = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) { try { xmlhttp_request = new ActiveXObject('Microsoft.XMLHTTP'); } catch (E) { xmlhttp_request = null; } } if (!xmlhttp_request && typeof XMLHttpRequest != 'undefined') { xmlhttp_request = new XMLHttpRequest(); } return xmlhttp_request; } </script> </head> <body> <form id="form1" runat="server"> <div> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"> <Columns> <asp:TemplateField> <ItemTemplate> <div> <a href="" onclick='getData(<%#Eval("id")%>);return false;'> <%#Eval("学生姓名")%> </a> </div> <div id="content<%#Eval("id")%>" style="display:none;"></div> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> </div> </form> </body> </html>
    2009年12月4日 18:02

答案

  • 你可以采用json进行处理,返回的格式为
    {"name":"孟宪会","content":"xxxxxxxxxxxxxxxx","date":"2010-1-1"}

    客户端字符串与json相互转换的方法有现成的代码
    http://json.org/
    【孟子E章】
    • 已标记为答案 KeFang Chen 2009年12月11日 4:07
    2009年12月5日 4:20
    版主
  • 老孟的意思是说你可以采用Ajax技术,把当前留言的id传到服务器端,然后根据这个id找到回复这条留言的所有信息,以json方式返回。

    json返回的数据本来就是一个数组形式。如你要显示某条记录的name属性,可以如下方式:result[0].name.

    Microsoft Online Community Support
    • 已标记为答案 KeFang Chen 2009年12月11日 4:07
    2009年12月7日 3:22

全部回复

  • 你可以采用json进行处理,返回的格式为
    {"name":"孟宪会","content":"xxxxxxxxxxxxxxxx","date":"2010-1-1"}

    客户端字符串与json相互转换的方法有现成的代码
    http://json.org/
    【孟子E章】
    • 已标记为答案 KeFang Chen 2009年12月11日 4:07
    2009年12月5日 4:20
    版主
  • 你这个json我看了看,没有很看懂,像我这种多人回复的情况,这些数据应该用数组的形式保存吧?可在ASP.NET中应该怎么将数据从数据库中读取后转换成这种格式呢?然后在前台又怎么显示呢?我现在是用SqlHelper.cs读取数据的。本来我是想绑定到Repeater上的,可是发现不行。

       private void showData(string cid)
        {
            int ReplyId = Int32.Parse(cid);
    
            string sql = "SELECT * FROM msg_reply WHERE ctt_id = " + ReplyId + " ORDER BY id";
            SqlCommand cmd = new SqlCommand();
    
            SqlDataReader mydr = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction,
                CommandType.Text, sql, null);
    
            rptProduct.DataSource = mydr;
    
            rptProduct.DataBind();
        }
    2009年12月5日 10:09
  • 你从服务器上面返回的是个集合的话为什么不用DOM呢?
    在服务器上返回一个XMLDOCUMENT到客户端来啊,在用 x.responseXML来接收这个XML文档就可以了,解析出来就OK啊
    2009年12月6日 5:20
  • 老孟的意思是说你可以采用Ajax技术,把当前留言的id传到服务器端,然后根据这个id找到回复这条留言的所有信息,以json方式返回。

    json返回的数据本来就是一个数组形式。如你要显示某条记录的name属性,可以如下方式:result[0].name.

    Microsoft Online Community Support
    • 已标记为答案 KeFang Chen 2009年12月11日 4:07
    2009年12月7日 3:22