天天看点

Ajax留言板

在整理以前资料时偶尔发现有一个效果不错的Ajax留言板程序,是以前一个系统的一个部分。今天抽了点时间,将其独立成一个项目,与大家分享下,先来看下具体的效果图:

<a target="_blank" href="http://blog.51cto.com/attachment/201105/145316199.jpg"></a>

思路很简单,就是一般的Ajax系统,主要是里面的一些jQuery的特效确实不错。下面是实现步骤:

环境:Visual Studio 2010 + SQL Server 2008 + jQuery1.4.1

1. 首先设计数据库,很简单,留言人、留言时间、留言内容、头像等字段,具体的数据库表创建语句如下

CREATE TABLE [dbo].[tb_message_board](  

    [MSG_ID] [int] IDENTITY(1,1) NOT NULL,  

    [MSG_USER] [nchar](20) NULL,  

    [MSG_FACE] [nchar](50) NULL,  

    [MSG_CONTENT] [nchar](100) NULL,  

    [MSG_TIME] [datetime] NULL  

) ON [PRIMARY] 

大家可以在自己机器上执行该SQL ,你项目的数据库,同时要修改Web.config中的数据库名;

2. 创建ASP.NET 应用程序,默认已经有母版页了,我们只要添加一个使用了默认母版页的Web页面,取名为MessageBoard;

3. 创建一些常用的文件夹,如images文件夹,用来存放项目中使用的图片,我这边最后创建后的解决方案管理器如下图:

<a target="_blank" href="http://blog.51cto.com/attachment/201105/145407579.jpg"></a>

4. 使用div 及css 布局你的留言板页面,我之前参考了http://www.css88.com/demo/ajax-deleet 中的布局;

5. 当初为了方便起见,使用了最基础的SQL Helper作为数据操作类,下面是该 SQL Helper类的代码:

/*  

 * 文件名:SQLHelper  

 * 说明:SQL Server帮助类  

 * 作者:Alexis  

 * 网站:http://alexis.blog.51cto.com/  

 * 创建时间:20100428  

 * */  

using System;  

using System.Data;  

using System.Configuration;  

using System.Linq;  

using System.Web;  

using System.Web.Security;  

using System.Web.UI;  

using System.Web.UI.HtmlControls;  

using System.Web.UI.WebControls;  

using System.Web.UI.WebControls.WebParts;  

using System.Xml.Linq;  

using System.Data.SqlClient;  

/// &lt;summary&gt; 

///SQLHelper 的摘要说明  

/// &lt;/summary&gt; 

public class SQLHelper  

{  

    SqlConnection conn;  

    public SQLHelper()  

    {  

        string connectionString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["MessageBoard"].ToString();  

        conn = new SqlConnection(connectionString);  

    }  

    /// &lt;summary&gt; 

    /// 执行SQL命令,将数据赋给数据集的引用  

    /// &lt;/summary&gt; 

    public bool RunSQL(string cmdText, ref DataTable dt)  

        try  

        {  

            conn.Open();  

            SqlCommand cmd = new SqlCommand(cmdText, conn);  

            SqlDataAdapter sda = new SqlDataAdapter(cmd);  

            DataSet ds1 = new DataSet();  

            sda.Fill(ds1);  

            dt = ds1.Tables[0];  

        }  

        catch (SqlException se)  

            return false;  

            throw new Exception(se.Message, se);  

        return true;  

    /// 执行带参数的SQL语句  

    /// &lt;param name="cmdText"&gt;&lt;/param&gt; 

    /// &lt;param name="sp"&gt;&lt;/param&gt; 

    public bool RunSQL(string cmdText, SqlParameter[] sp)  

            if(conn.State== ConnectionState.Closed)  

                conn.Open();  

            if (sp != null)  

            {  

                for (int i = 0; i &lt; sp.Length; i++)  

                {  

                    cmd.Parameters.Add(sp[i]);//将参数加到Command中  

                }  

            }  

            cmd.ExecuteNonQuery();  

        finally  

            conn.Close();  

    public DataTable getDataTable(string cmdText)  

        DataTable dt = null;  

            if (conn.State == ConnectionState.Closed)  

            DataSet ds = new DataSet();  

            SqlDataAdapter da = new SqlDataAdapter(cmd);  

            da.Fill(ds);  

            dt = ds.Tables[0];  

        return dt;  

}  

6. 创建数据库对象的实体类,也是十分简单的,就是对应数据库的字段;

 * 文件名:Message  

 * 说明:Message实体类  

 * 网站:http://alexis.blog.51cto.com/

using System.Collections.Generic;  

namespace MessageBoard  

    /// 留言类  

    public class Message  

        private int id;//留言的标识  

        public int Id  

            get { return id; }  

            set { id = value; }  

        private string msg_content;//留言的内容  

        public string Msg_content  

            get { return msg_content; }  

            set { msg_content = value; }  

        private string msg_nickname;// 昵称  

        public string Msg_nickname  

            get { return msg_nickname; }  

            set { msg_nickname = value; }  

        private string msg_face;//选择的头像  

        public string Msg_face  

            get { return msg_face; }  

            set { msg_face = value; }  

        private DateTime msg_time;//留言的时间  

        public DateTime Msg_time  

            get { return msg_time; }  

            set { msg_time = value; }  

7.开始着手写js代码,在写ajax事件之前,先来看下两个jQuery插件,首先是jQuery文本框水印效果,效果图如下:

<a target="_blank" href="http://blog.51cto.com/attachment/201105/150046260.jpg"></a>

 使用方法:添加watermarkinput 的js引用,为想要实现水印效果的文本框加上id如,

&lt;input type="text" id="msg_nickname" size="40" /&gt; 之后再js代码中写如下的代码以处理水印//处理水印  

        jQuery(function ($) {  

            $("#msg_nickname").Watermark("请输入您的昵称,如果不输入则默认为匿名");  

        });  

        function UseData() {  

            $.Watermark.HideAll();   //Do Stuff     

            $.Watermark.ShowAll();  

        } 

8. jQuery图片缩放插件,jquery.imgzoom.js ,具体的效果:点击图标的时候,图片渐渐变大,直至原来的大小,如果是Gif图片的话,效果会更好。

9. 编写具体的Ajax代码,使用jQuery框架将会节省很多的时间,当我们点击留言按钮的时候,将一些信息收集起来,然后通过Ajax写入数据库,然后使用布局修改DOM来实现无刷新的效果,主要的代码如下:

//使用ajax处理留言  

                $.ajax({  

                    type: "POST",  

                    url: "Ajax/MessageBoardHandler.ashx?action=add",  

                    data: "msg_nickname=" + escape(msg_nickname) + "&amp;msg_content=" + escape(msg_content) + "&amp;msg_time=" + msg_time + "&amp;msg_face=" + msg_face,  

                    success: function (msg) {  

                        //在table中新增一行  

                        if (msg == "success") {  

                            $('#messagelist').append("&lt;div class='box clearfix' id=''&gt;&lt;img src='" + msg_face +  

                                "' alt='' width='50' height='50' class='avatar' /&gt;&lt;div class='text'&gt;&lt;strong&gt;&lt;a href='#'&gt;" + msg_nickname + "&lt;/a&gt;&lt;/strong&gt;&lt;p&gt;" + msg_content +"&lt;/p&gt;&lt;div class='date'&gt;"+msg_time+"&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;");  

                        }  

                    }  

                }); 

上面的一些变量重字面上也能知道是我们收集的信息,即要写如数据库的留言信息;

10. 编写Ajax处理类的代码,将信息插入数据库,代码如下:

public void ProcessRequest(HttpContext context)  

            context.Response.ContentType = "text/plain";  

            string action = context.Request.Params["action"].ToString();//获取想要做的操作  

            if (action == "add")//新增留言  

                Message message = new Message();//创建新的留言对象  

                message.Msg_nickname = context.Request.Params["msg_nickname"].ToString();//昵称  

                message.Msg_content = context.Request.Params["msg_content"].ToString();//留言内容  

                message.Msg_time = DateTime.Parse(context.Request.Params["msg_time"].ToString());//留言时间  

                message.Msg_face = context.Request.Params["msg_face"].ToString();//选择的头像  

                MessageAdd(message,context);  

            else if (action=="del")//删除留言  

        /// &lt;summary&gt; 

        /// 新增留言  

        /// &lt;/summary&gt; 

        /// &lt;param name="message"&gt;&lt;/param&gt; 

        private void MessageAdd(Message message, HttpContext context)  

            SQLHelper helper = new SQLHelper();  

            string cmdText = "INSERT INTO TB_MESSAGE_BOARD(MSG_USER,MSG_CONTENT,MSG_FACE,MSG_TIME) VALUES('" +  

                message.Msg_nickname + "','" + message.Msg_content + "','" + message.Msg_face + "','" + message.Msg_time + "')";  

            if(helper.RunSQL(cmdText, null))  

                context.Response.Write("success");  

在这个类里面就用到了SQL Helper了;

 11. 编写MessageBoard的后台代码,我们在加载留言本页面的时候,需要将已有的留言信息显示在页面中,

 * 文件名:MessageBoard  

 * 说明:使用Ajax的留言板  

 * 创建时间:20101226  

    public partial class MessageBoard : System.Web.UI.Page  

        protected DataTable dt;  

        protected void Page_Load(object sender, EventArgs e)  

            GetMessage();  

        //从数据库中读取留言信息  

        protected void GetMessage()  

            dt=helper.getDataTable("select * from tb_message_board");  

12. 在前台显示这些数据,使用的内部变量,即 &lt;%=dt.Rows[i]["msg_time"]%&gt;这种形式的代码,详细的代码可以参考源文件

<a target="_blank" href="http://alexis.blog.51cto.com/attachment/201105/2621421_1306393457.rar"></a>

<a href="http://down.51cto.com/data/2358226" target="_blank">附件:http://down.51cto.com/data/2358226</a>

    本文转自xshf12345 51CTO博客,原文链接:http://blog.51cto.com/alexis/574676,如需转载请自行联系原作者