首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

ajax+asp.net+mssql无刷新聊天室解决方案

2012-01-13 
ajax+asp.net+mssql无刷新聊天室ajax+asp.net+mssql实现的ajax无刷新聊天室,支持html web编辑器。供大家参

ajax+asp.net+mssql无刷新聊天室
ajax+asp.net+mssql实现的ajax无刷新聊天室,支持html web编辑器。供大家参考下。

不过有个小问题,就是firefox下如果使用快捷键ctrl+enter发送信息时,如果不延时调用发送函数,会弹出ff的下载对话框,奇怪。

谁能解决这个问题,100分归他,其他100分当作散分。

JScript code
if(e.ctrlKey&&e.keyCode==13){          e.preventDefault();          e.stopPropagation();          setTimeout("Showbo.Chat.send()",50);//在ff中马上使用alert提示时尽然弹出下载工具,奇怪.          return false;}       },false);






为了加快速度,使用了存储过程。

aspphp版本请看下面的文章

ajax+asp+mssql无刷新聊天室
ajax+php+mssql无刷新聊天室


要使用不同的动态页面,只需要更改lib.js文件中RequstUrl变量的值即可。

完整示例下载

效果如下









内容长度限制,所以就不贴出所有的代码了,要看全部代码请下载示例或者查看下面这篇文章
ajax+asp.net+mssql无刷新聊天室


下面贴出C#的主要的代码,其他版本请查看上面的链接

ajax.cs
C# code
using System;using System.Web;using System.Data;using System.Configuration;using System.Data.SqlClient;public class Ajax{    private static bool IsNull(string v)    {        if (v == null || v.Trim() == "") return true;        else return false;    }    private static string Js(string v)    {        return v.Replace("'", "\\'");    }    public static string Login()    {        HttpRequest Request = HttpContext.Current.Request;        string rStr = "";        string UserName = Request.Form["nn"];        if (IsNull(UserName))        {            rStr = "success:false,err:'昵称不能为空!'";        }        else if (UserName.Length > 20)        {            rStr = "success:false,err:'昵称不能超过20个字符!'";        }        else        {            string UserId = "", Key = "";            SqlConnection cn = new SqlConnection(ConfigurationSettings.AppSettings["db"]);            cn.Open();            try            {                SqlCommand cm = new SqlCommand("ajaxLogin", cn);                cm.CommandType = CommandType.StoredProcedure;                cm.Parameters.Add(new SqlParameter("@UserName", SqlDbType.NVarChar, 50));                cm.Parameters["@UserName"].Value = UserName;                //==========输出参数                cm.Parameters.Add(new SqlParameter("@UserId", SqlDbType.NVarChar, 18));                cm.Parameters["@UserId"].Direction = ParameterDirection.Output;                cm.Parameters.Add(new SqlParameter("@UserKey", SqlDbType.NVarChar, 5));                cm.Parameters["@UserKey"].Direction = ParameterDirection.Output;                                cm.ExecuteNonQuery();                UserId = cm.Parameters["@UserId"].Value.ToString().Trim();                Key = cm.Parameters["@UserKey"].Value.ToString().Trim();                if (UserId == "-1") rStr = @"success:false,err:'发生错误,请稍后再试!'";                else if (UserId == "0") rStr = @"success:false,err:'已经存在此用户昵称,请修改您的昵称!'";                else rStr += "success:true,UserId:'" + UserId + "',Key:'" + Key + "'";                cm.Dispose();            }            catch (Exception e)            {                rStr = @"success:false,err:'原因\\n" + Js(e.Message) + "'";            }            cn.Close();        }        return rStr;    }    public static string Logout()    {        HttpRequest Request = HttpContext.Current.Request;        string rStr = "", UserId = Request.Form["uid"], Key = Request.Form["key"];        if (IsNull(UserId) || IsNull(Key)) return "success:false,err:'用户信息丢失!'";        SqlConnection cn = new SqlConnection(ConfigurationSettings.AppSettings["db"]);        cn.Open();        try        {            SqlCommand cm = new SqlCommand("ajaxLogout", cn);            cm.CommandType = CommandType.StoredProcedure;            cm.Parameters.Add(new SqlParameter("@UserId", SqlDbType.NVarChar, 18));            cm.Parameters["@UserId"].Value = UserId;            cm.Parameters.Add(new SqlParameter("@UserKey", SqlDbType.NVarChar, 5));            cm.Parameters["@UserKey"].Value = Key;            cm.Parameters.Add(new SqlParameter("@Result", SqlDbType.Int));            cm.Parameters["@Result"].Direction = ParameterDirection.Output;            cm.ExecuteNonQuery();                        if(cm.Parameters["@UserId"].Value.ToString().Trim()=="0")rStr = "success:false,err:'用户信息不存在!'";            else rStr="success:true";            cm.Dispose();        }        catch (Exception e)        {                    }        cn.Close();        return rStr;    }    public static string Say()    {        HttpRequest Request = HttpContext.Current.Request;        string From = Request.Form["from"], To = Request.Form["to"]            , Key = Request.Form["key"], Msg = Request.Form["ct"], rStr = "";        if (IsNull(From) || IsNull(Key) || IsNull(To) || IsNull(Msg)) rStr = "success:false,err:'信息传递不完整!'";        else        {            SqlConnection cn = new SqlConnection(ConfigurationSettings.AppSettings["db"]);            cn.Open();            try            {                               SqlCommand cm = new SqlCommand("ajaxSay", cn);                cm.CommandType = CommandType.StoredProcedure;                cm.Parameters.Add(new SqlParameter("@UserKey", SqlDbType.NVarChar, 5));                cm.Parameters["@UserKey"].Value = Key;                cm.Parameters.Add(new SqlParameter("@From", SqlDbType.NVarChar, 18));                cm.Parameters["@From"].Value = From;                cm.Parameters.Add(new SqlParameter("@To", SqlDbType.NVarChar, 18));                cm.Parameters["@To"].Value = To;                cm.Parameters.Add(new SqlParameter("@Msg", SqlDbType.NVarChar, 800));                cm.Parameters["@Msg"].Value = Msg;                cm.Parameters.Add(new SqlParameter("@Result", SqlDbType.Int));                cm.Parameters["@Result"].Direction = ParameterDirection.Output;                cm.ExecuteNonQuery();                if (cm.Parameters["@Result"].Value.ToString() == "0") rStr = "sucess:false,err:'发表失败!\\n原因:接收者已经不存在!'";                else rStr = "success:true";                cm.Dispose();            }            catch (Exception e)            {                rStr = "sucess:false,err:'发表失败!原因\\n" + Js(e.Message) + "'";            }            cn.Close();        }        return rStr;    }    public static string ReadUser()    {        HttpRequest Request = HttpContext.Current.Request;        string rStr = "", UserId = Request.Form["uid"];        if (IsNull(UserId)) rStr += "success:false,err:'用户id丢失!'";        else        {            SqlConnection cn = new SqlConnection(ConfigurationSettings.AppSettings["db"]);            cn.Open();            try            {                SqlCommand cm = new SqlCommand("ajaxReadUser", cn);                cm.CommandType = CommandType.StoredProcedure;                cm.Parameters.Add(new SqlParameter("@UserId", SqlDbType.NVarChar, 18));                cm.Parameters["@UserId"].Value = UserId;                string j = "";                SqlDataReader dr = cm.ExecuteReader();                while (dr.Read()) j += ",{id:'" + dr[0] + "',nn:'" + Js(dr[1].ToString()) + "'}";                dr.Close();                cm.Dispose();                rStr = "success:true,data:[" + (j == "" ? "" : j.Substring(1)) + "]";            }            catch (Exception e)            {                rStr = @"success:false,err:'发生如下错误\\n" + Js(e.Message) + "'";            }            cn.Close();        }        return rStr;    }    public static string Read()    {        HttpRequest Request = HttpContext.Current.Request;        string rStr = "";        string UserId = Request.Form["uid"], Key = Request.Form["key"];        if (IsNull(UserId) || IsNull(Key)) rStr = "success:false,err:'用户信息丢失!'";        else        {            SqlConnection cn = new SqlConnection(ConfigurationSettings.AppSettings["db"]);            cn.Open();            try            {                SqlCommand cm = new SqlCommand("ajaxRead", cn);                cm.CommandType = CommandType.StoredProcedure;                cm.Parameters.Add(new SqlParameter("@UserId", SqlDbType.NVarChar, 18));                cm.Parameters["@UserId"].Value = UserId;                cm.Parameters.Add(new SqlParameter("@UserKey", SqlDbType.NVarChar, 5));                cm.Parameters["@UserKey"].Value = Key;                SqlDataReader dr = cm.ExecuteReader();                string j = "";                while (dr.Read()) j += ",'" + Js(dr[0].ToString()) + "'";                dr.Close();                cm.Dispose();                rStr = "success:true,data:[" + (j == "" ? "" : j.Substring(1)) + "]";            }            catch (Exception e)            {                rStr = "success:false,err:'发生以下错误" + Js(e.Message) + "'";            }            cn.Close();        }        return rStr;    }} 



[解决办法]
我不用firefox,所以我只是来接分的,另外感谢LZ分享
[解决办法]
帮你顶了
[解决办法]
感谢分享
[解决办法]
支持 ~
[解决办法]
ruv wv
[解决办法]
这个要顶
[解决办法]
Up...
[解决办法]

[解决办法]
接分感谢楼主分享
[解决办法]
不错

支持分享!
[解决办法]
多谢楼主分享
[解决办法]
支持
[解决办法]
我 也在写这个功能
请问你是怎么判断用户是否在线的?
[解决办法]
好问题,日文系统。
[解决办法]
顶哦。我也想做。
[解决办法]
分享快乐,支持
[解决办法]
这个必须收藏!!06年时就想要,后来一直没做聊天室,也就放下了。
[解决办法]
收藏,有空研究下~
[解决办法]
ding
[解决办法]
探讨
引用:
我 也在写这个功能
请问你是怎么判断用户是否在线的?


有用户表啊,退出了就删除用户了。不是注册的用户的。

如果你是注册用户,多建立一个在线表就可以解决问题了。


firefox下如果使用快捷键ctrl+enter发送信息时,如果不延时调用发送函数,会弹出ff的下载对话框,奇怪。


这个问题没有人碰到过吗???100分啊,这个问题。。



[解决办法]
upupup
[解决办法]
学习
[解决办法]
顶起来 学习
[解决办法]

[解决办法]
学习啊
[解决办法]
这个比网上的都详细多了,谢谢楼主了
[解决办法]
顶!!JF
[解决办法]
顶下先,兼容问题?
[解决办法]
如果可以,还请楼主有机会详细讲解分享下,希望可以跟楼主qq交流,我正在做这个东西,请指教
[解决办法]
不会弄聊天室.判断在线用户的搞的头大,结果就随便写了个2人聊天的....
貌似没碰到你的问题
JScript code
function checkInput(event){    event=(event)?event:window.event; //为了兼容FF    if (event.keyCode==13||event.charCode==13)    {        var content=document.getElementById("sendtext").value;        if (content!="")        {            Chat.SendMsg(content); //调用后台方法发送消息            document.getElementById("Main").scrollTop=document.getElementById("Main").scrollHeight;            document.getElementById("sendtext").value="";        }        else        {            document.getElementById("sendtext").value="";        }    }} 


[解决办法]
學習 了
幫你頂哈···
[解决办法]
function keypress(evt)
{
evt = evt ? evt : (window.event ? window.event : null); 
if(evt.ctrlKey && evt.keyCode==13)
{
SendMsg();
return false;
}
else if(evt.ctrlKey && evt.keyCode==10)
{
event.keyCode = 13;
}
return true;
}
[解决办法]
接分
[解决办法]
看看
[解决办法]
这个绝对得顶,学习。。
[解决办法]
厉害啊
[解决办法]
这个 支持一下吧
[解决办法]
挺好
[解决办法]
厉害 ,先顶这个了~
[解决办法]
好东西就要收藏
[解决办法]
支持分享,
[解决办法]

HTML code
<body> <script type="text/javascript"> function isKeyTrigger(e,keyCode){     var argv = isKeyTrigger.arguments;     var argc = isKeyTrigger.arguments.length;     var bCtrl = false;     if(argc > 2){         bCtrl = argv[2];     }     var bAlt = false;     if(argc > 3){         bAlt = argv[3];     }     var nav4 = window.Event ? true : false;     if(typeof e == 'undefined') {         e = event;     }     if( bCtrl &&         !((typeof e.ctrlKey != 'undefined') ?             e.ctrlKey : e.modifiers & Event.CONTROL_MASK > 0)){         return false;     }     if( bAlt &&         !((typeof e.altKey != 'undefined') ?             e.altKey : e.modifiers & Event.ALT_MASK > 0)){         return false;     }     var whichCode = 0;     if (nav4) whichCode = e.which;     else if (e.type == "keypress" || e.type == "keydown")         whichCode = e.keyCode;     else whichCode = e.button;     return (whichCode == keyCode); } function ctrlEnter(e){     var ie =navigator.appName=="Microsoft Internet Explorer"?true:false;     if(ie){         if(event.ctrlKey && window.event.keyCode==13){doSomething();}     }else{         if(isKeyTrigger(e,13,true)){doSomething();}     } } function doSomething(){alert('Ctrl+Enter being Pressed.'); } </script> <textarea name="message" onkeyup="javascript:return ctrlEnter(event);">Ctrl+Enter Submit test</textarea> </body>
[解决办法]
这个应该和QQ差不多吧
[解决办法]
支持分享。
[解决办法]
学习了
[解决办法]
正需要!!!!!!!!!!!!!!!
[解决办法]
进来学习
------解决方案--------------------


顶!!JF
[解决办法]

[解决办法]
进来接分,顺便问个问题,你是怎么判断用户离开、或下线
[解决办法]
ff
[解决办法]
是不是和火狐自带的下载工具有冲突啊,可能火狐的快捷键就是ctrl+Enter,试试能不能屏蔽火狐的下载工具!我记得用火狐浏览器,如果想下载东西的话,火狐会调用自带的内部下载工具,连迅雷都起不来。我试过屏蔽它而调用迅雷,可以的,你也试试。不过要是客户用的话就麻烦了,他们那里晓得去屏蔽狐火的下载工具啊,所以完全之策就是更改热键ctrl+Enter,可以改为直接敲Enter
[解决办法]
很有意义!!!
[解决办法]
看过了 楼主的代码 很不错
[解决办法]
收藏,学习
[解决办法]

探讨
我不用firefox,所以我只是来接分的,另外感谢LZ分享

[解决办法]
学习。
[解决办法]
ding.............
[解决办法]
LZ有心啦 ,收藏,学习
希望 有更好的作品 嘻嘻!
[解决办法]

[解决办法]
http://www.code-design.cn/bblog6.html
不看不知道,一看就 不想走啦 哈哈 o(∩_∩)o
[解决办法]
向 你学习
[解决办法]
学习了,现在正在做这个呢。。。
[解决办法]
还好,顶
[解决办法]
Mark,拿来学习.
[解决办法]
up
[解决办法]
太高深
看不懂
[解决办法]

[解决办法]
猪猪侠
[解决办法]
顶下 怎么保存聊天记录的 如果这样的话
[解决办法]
jiefen
[解决办法]
学习吧
[解决办法]
路过学习

[解决办法]
jf

[解决办法]
路過學習.
[解决办法]
探讨
textarea是不弹下载窗口


但是可编辑的iframe中弹出来



[解决办法]
不错,一值得学习东西
[解决办法]
感谢分享!
[解决办法]
探讨


引用:
Firefox/3.0.13
测试在textarea中不弹下载啊

那就郁闷了。。。难道是版本的问题???我的是firefox2.0.0.12 3.0.3


[解决办法]
jf
[解决办法]
感谢分享!
[解决办法]
我是为了加分 然后下载破解rar文件的密码的 真是的
[解决办法]
还可以 能做出来就 好 东西要慢慢改进的 顶你
[解决办法]
马克
[解决办法]
呵呵 学习看看
[解决办法]
学习下、。

热点排行