ajax+asp.net+mssql无刷新聊天室

Go 旅城通票 2009-09-07 11:36:19
加精
以前说要放出来的,由于忙其他的事,没整理,现在放出来供大家参考下。

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

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

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




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

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

aspphp版本请看下面的文章

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

此例子也可以作为mssql存储过程使用的示例,如php调用mssql的存储过程,php获取mssql数据库的输出参数。

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

完整示例下载

效果如下









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


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

ajax.cs
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;
}
}
...全文
4335 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolwindysoon 2010-10-04
  • 打赏
  • 举报
回复
很好,急需……
ap0533126 2009-09-16
  • 打赏
  • 举报
回复
我知道,做个标记,明天解答~~
cloud100x 2009-09-16
  • 打赏
  • 举报
回复
没碰过
http://www.zainanbao.com
Go 旅城通票 2009-09-16
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 sanjin27 的回复:]
楼主做过对日的?要不就是大连人?

接分~~~
[/Quote]

曾经学过,现在忘的差不多了,呵呵~~

做对日还不行,日语烂的很~
TzSword 2009-09-16
  • 打赏
  • 举报
回复
到其他浏览器试试吧。。。
单得100分太贪心的。。。
我还是要散分的吧。。。。。
poul000000 2009-09-15
  • 打赏
  • 举报
回复
......这都能看得出来。
sanjin27 2009-09-14
  • 打赏
  • 举报
回复
楼主做过对日的?要不就是大连人?

接分~~~
xiaoronghu 2009-09-14
  • 打赏
  • 举报
回复
下下來慢慢研究
feiyun1102 2009-09-11
  • 打赏
  • 举报
回复
参考一下
zhongwei11 2009-09-10
  • 打赏
  • 举报
回复
学习~~学习
mark620 2009-09-10
  • 打赏
  • 举报
回复
先看看吧
「已注销」 2009-09-09
  • 打赏
  • 举报
回复
下了,有时间在慢慢研究~~~~
Go 旅城通票 2009-09-08
  • 打赏
  • 举报
回复
把问题提取出来,精简一下。编辑器是可编辑的Iframe,不是textarea,


ie6,safari3.0.4,opera9,谷歌0.4 中都没出现问题,就是在firefox中出现了弹出下载对话框的问题。

在发送信息时要检查是否输入内容,所以如果为空时就alert提示信息为空,然后firefox就弹出下载对话框了,不管是ff2

还是ff3都存在这个问题。


<!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>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
<style type="text/css">
#HtmlEditor{border:solid 1px black;margin:100px auto;display:block;width:600px;height:150px;}
</style>
</head>
<body>
<script type="text/javascript">
//firefox2.0.0.12 3.0.3
var IsIE=!!document.all;

function send(){
alert('调用类库函数发送信息!');
}

function setEditable(){
var editor=IsIE?document.frames["HtmlEditor"]:document.getElementById('HtmlEditor').contentWindow;
try{
var doc=editor.document;
if(doc.body){
doc.body.style.fontSize='14px';
doc.body.style.fontFamily="verdana";
doc.body.style.margin="4px";
}
doc.designMode="On";
if(IsIE)doc.contentEditable="True";
//==================初始化事件
initEvent(doc,editor);
}catch(e){alert(e)}
}
function initEvent(doc,editor){
if(IsIE){//=====================IE===================
doc.onkeydown=function(){
e=editor.event;//注意这里获取的是iframe中的事件对象
if(e.keyCode==13){
e.returnValue=false;
e.keyCode=0;
if(e.ctrlKey){send();return false;}
//在ie时回车生成<p>,替换为<br>.ff下生成<br>,所以不需要处理回车
var r=this.selection.createRange();
r.pasteHTML("<br>");
r.select();
}
}
}
else doc.addEventListener('keydown',function(e){
if(e.ctrlKey&&e.keyCode==13){
e.preventDefault();
e.stopPropagation();
//====================可以分别注释下面的句子试试就知道了=============
send();//在ff中马上使用alert提示时弹出下载工具,奇怪.
//setTimeout("send()",50);//延时就不会弹出下载工具
return false;}
},false);
};
</script>
<iframe ID="HtmlEditor" name="HtmlEditor" frameborder="0" marginheight="0" marginwidth="0" src="about:blank" onload="setEditable()"></iframe>
</body>
</html>
luffyke 2009-09-08
  • 打赏
  • 举报
回复
接分!没遇过那样的问题
yuanmanguo 2009-09-08
  • 打赏
  • 举报
回复
学习 接分
mili_eclipse 2009-09-08
  • 打赏
  • 举报
回复
mark! 有时间再学习!
sciolist 2009-09-08
  • 打赏
  • 举报
回复
顶呐
xiezhenxiang 2009-09-08
  • 打赏
  • 举报
回复
下了,有时间再慢慢研究
lbcleo 2009-09-08
  • 打赏
  • 举报
回复
JF
mahui19780126 2009-09-07
  • 打赏
  • 举报
回复
ding
加载更多回复(6)

52,797

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ajax
社区管理员
  • Ajax
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧