Ajax(Asynchronous JavaScript and XML),按我的理解,就是异步执行的JavaScript and XML,它的核心是XMLHttpRequest,是多种技术的综合,包括Javascript、XHTML和CSS、DOM、XML和XSTL、XMLHttpRequest。它带给用户的体验就是页面无刷新。最简单的应用象Gmail中,发信时输入对方邮件地址时,出现的友好提示。

Ajax的网站:
http://www.schwarz-interactive.de/
ajax的google上的中文讨论组:
http://groups.google.com/group/AjaxCn
E文的:
http://groups.google.com/group/ajaxpro

接下来我做这样一个程序,在一个文本框中输入字符,文本框下边就提示最和它匹配的内容。效果类似Gmail的输入邮件地址时,下边出现的提示。在这儿,提示内容提取Sql server 2000的Northwind库customers表Country字段的内容。在数据未加载完成前,显示Loading...这样的提示。

1.先下载http://www.schwarz-interactive.de/download/5.11.4.2.zip
解压后有AjaxPro.dll,AjaxPro.2.dll文件,AjaxPro.2.dll应该是for .net 2.0的。
我用的是vs2003.net所以用AjaxPro.dll。
2.把AjaxPro.dll复制到web应用程序的bin目录,在项目中添加对AjaxPro.dll的引用
3.web.config的<system.web>节中加入:
<httpHandlers>
<add verb="POST,GET" path="ajaxpro/*.ashx" type="AjaxPro.AjaxHandlerFactory, AjaxPro"/>
</httpHandlers>
意思是将ajaxpro路径下的文件扩展名为.ashx的文件的HTTP POST和HTTP GET请求映射到类AjaxPro.AjaxHandlerFactory,该类在文件AjaxPro.dll中的程序集AjaxPro中。httpHandlers元素说明详见msdn>>

4.添加一个web窗体test.aspx,切换到cs文件,添加引用:

using System;
using System.Data;
using System.Data.SqlClient;

using AjaxPro;

5.Page_Load中注册:

private void Page_Load(object sender, System.EventArgs e)
    {           
                 Utility.RegisterTypeForAjax(
typeof(test)); 
    }

此处test是Page_Load所在类的完整的命名空间(namespace test)。

6.从Sql server 2000的Northwind库里面customers表中提出Country字段的内容。
代码如下:

[AjaxMethod]
        
public string getData( string inputString )
        
{
            System.Threading.Thread.Sleep(
1000);  //进程睡眠(延时)1秒
            
string temp = "";
            
if (inputString != "")
            
{
                
string sqlStr = "SELECT Country FROM Customers where Country like '%" +inputString+"%'";
                SqlConnection conn 
= new SqlConnection(@"server=.;database=NorthWind;User ID=sa;password=123;Persist Security Info=true;");
                SqlCommand cmd 
= new SqlCommand(sqlStr,conn);
                conn.Open();
                SqlDataReader myReader 
= cmd.ExecuteReader();    
                
try 
                
{
                    
while (myReader.Read()) 
                    
{
                        temp 
+= myReader.GetString(0).ToLower().Replace(inputString.ToLower(),"<font color=red>"+inputString+"</font>")+"<br>" ;  //把匹配的内容替换为红色显示
                    }

                }

                
finally 
                
{
                    myReader.Close();
                    conn.Close();
                }

            }
  
            
return temp;
        }

注意:在该方法前要加 [AjaxMethod],还有
System.Threading.Thread.Sleep(1000);
为了看到loading的效果,我有意让进程延时1秒。

7. 进入test.aspx的html编辑视图,<form>中加入如下代码:

<!--loading文字层,默认隐藏-->
<div id="loadinfo" style="visibility:hidden;position:absolute;left:168px;top:19px;background-color:Red;color:White;font-family: Verdana;font-size: 12px;">Loading</div>
<INPUT type="text" id="txtInput" onKeyUp="javascript:doTest2();void(0);">
<!--显示匹配内容的层,默认隐藏-->
<div id="Layer1" style="position:absolute; left:10px; top:38px; width:150px; height:102px; z-index:1; background-color: #ECF5FF; border: 1px solid #666666; visibility: hidden;overflow: auto;"></div>

8.在test.aspx的<head>区加入以下代码:

<script type="text/javascript" defer="defer">
   test.test.onLoading 
= function(b) {
   
var l = document.getElementById("loadinfo");    
   l.style.visibility 
= b ? "visible" : "hidden";    
   }
    
   
function doTest2()
   
{
    test.test.getData(document.getElementById(
"txtInput").value, doTest2_callback);
   }

   
function doTest2_callback(res)
   
{
    
var p = res.value;
    
var layer1 = document.getElementById("Layer1");
    layer1.style.visibility 
= (p == ""? "hidden" : "visible";
    document.getElementById(
"Layer1").innerHTML = p;
   }

</script>

其中test.test.onLoading是namespace.class.onLoading的格式,onLoading是ajax内定这么写的。参数b是一个bool值,当请求的类正在执行时,结果为true,否则为false。用一个三元表达式控制loading层(id为loadinfo)的显示和隐藏。
test.test.getData中,getData应该与后台代码中取数据的类名一致,但是注意一点,结果的返回用doTest2_callback函数的参数res按收。
在doTest2_callback(res)中,把获得的数据显示到Layer1层。这儿,当返回的内容为空时,Layer1层不显示。

9.完成后的完整代码 Ajaxtest.rar

10,编译运行程序。输入内容看一下效果。


posted on 2006-01-13 11:23 三千 阅读(1463) 评论(7)  编辑 收藏 所属分类: [D]. ASP.NET[B]. Ajax

评论:
#1楼  2006-01-13 16:32 | 听棠.NET      
这个好象比MagicAjax复杂啊。我看了MagicAjax使用起来非常方便的。一句JS都不用写的,而且直接对ASP.NET的控件上使用,原系统的一点代码都不需要修改就可以实现无刷新提交了!!!http://www.magicajax.net/
  回复  引用  查看    
#2楼  2006-01-14 10:56 | 老家伙来挨踢      
我用了这个,虽然需要自己写JS,但也增加了灵活性。还是很好用的。
  回复  引用  查看    
#3楼  2006-03-27 12:44 | 健忘猪      
有个小问题:你在打开页面的时候 把鼠标放到页面上 那个laod就出不来了 回提示页面出错
  回复  引用  查看    
#4楼  2006-04-24 09:00 | cdbt858 [未注册用户]
Thank you very much~~!!!就在找这个:)
  回复  引用    
#5楼  2006-06-02 14:36 | youke [未注册用户]
我在做ajaxpro的时候,有一个xml作为数据岛来刷新页面,但在ie的不同版本上就弄的发晕---一些不能刷新。ajaxpro 太难调试了。。
  回复  引用    
#6楼  2008-06-04 17:03 | 无需张扬      
学习了,楼主讲的很详细,AJAXPRO确实灵活,很好用!
  回复  引用  查看    
#7楼 [楼主] 2008-06-05 17:49 | 三千      
@无需张扬

:D


  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-02-24 00:44 编辑过


相关链接: