无刷新联动大烧烤(XMLHttpRequest,AJAX Library)

      关于无刷新联动,目前实现的方法有很多种,可以使用XMLHttpRequest对象来实现,也可以采用Ajax Library,另外也可以使用AjaxControlToolkit里的控件来实现.刚刚这些天在一个项目里使用到了这个功能.下面简单介绍下实现的思路.希望对初学者在学习上有所帮助.
    
     通常联动又分静态联动(数据不变)和动态联动(数据会变动),比如省市区县这里固定数据就是很少变动的。又比如一个公司里,下面分得有不同的部分,各部门下又可能有不能的小组......这样的关系,各个小组都有可能随时都会变动的,撤消也可能会增加小组等。下面我就一动态联动简单介绍下。

准备工作:
 ● 建立数据库

无刷新联动大烧烤(XMLHttpRequest,AJAX Library) Code

 ● 初始化数据
     无刷新联动大烧烤(XMLHttpRequest,AJAX Library)

 ● 建立相关类和WebService

无刷新联动大烧烤(XMLHttpRequest,AJAX Library) City
无刷新联动大烧烤(XMLHttpRequest,AJAX Library) District
无刷新联动大烧烤(XMLHttpRequest,AJAX Library) AjaxPattern.WebService

一、使用XMLHttpRequest实现
     建立两个aspx文件,AjaxClient.asp,AjaxServer.aspx,下面是两个文件的CS代码定义:

 1 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) public   partial   class  AjaxClient : System.Web.UI.Page
 2 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) {
 3无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    protected void Page_Load(object sender, EventArgs e)
 4无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    {
 5无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        if (!IsPostBack)
 6无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        {
 7无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            this.ddlCitys.DataSource = new WebService().GetCitys();
 8无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            this.ddlCitys.DataTextField = "CityName";
 9无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            this.ddlCitys.DataValueField = "CityID";
10无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            this.ddlCitys.DataBind();
11无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            ddlCitys.Items.Insert(0new ListItem("--请选择--""0"));
12无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            ddlDistricts.Items.Insert(0new ListItem("--请选择--""0"));
13无刷新联动大烧烤(XMLHttpRequest,AJAX Library)
14无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            this.ddlCitys.Attributes.Add("onchange""getDistrictByCityID(this.value);");
15无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            this.ddlDistricts.Attributes.Add("onchange""displayResults();");
16无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        }

17无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    }

18无刷新联动大烧烤(XMLHttpRequest,AJAX Library)}

     在AjaxClient.aspx里放置了两个下拉列表控件,一个用来显示城市,一个用来显示区。在AjaxClient的服务端我们为城市绑定好数据,这里是通过调用WebService里的GetCitys()得到的一个数组,详细可以看上面的WebService的详细定义代码,这里我们还为这两个控件设置了客户端事件及响应事件的方法。下面我们看看AjaxServer.aspx的定义:

 1 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) public   partial   class  AjaxServer : System.Web.UI.Page
 2 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) {
 3无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    protected void Page_Load(object sender, EventArgs e)
 4无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    {
 5无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        int cityID = 0;
 6无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        if (Request["CityID"!= null)
 7无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        {
 8无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            int.TryParse(Request["CityID"], out cityID);
 9无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        }

10无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        GetDistricts(cityID);
11无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    }

12无刷新联动大烧烤(XMLHttpRequest,AJAX Library)
13无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    private void GetDistricts(int cityID)
14无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    {
15无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        District[] dist = new WebService().GetDistricts(cityID);
16无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        StringBuilder sb = new StringBuilder();
17无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        sb.Append(@"<?xml version=""1.0"" ?>");
18无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        sb.Append(@"<Districts>");
19无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        foreach (District d in dist)
20无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        {
21无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            sb.Append(@"<District id='" + d.DistrictId + "' cityID='" + d.CityID + "'>" + d.DistrictName + "</District>");
22无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        }

23无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        sb.Append(@"</Districts>");
24无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        Response.Clear();
25无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        Response.ContentType = "text/xml";
26无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        Response.Write(sb.ToString());
27无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        Response.End();
28无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    }

29无刷新联动大烧烤(XMLHttpRequest,AJAX Library)}

    上面的代码不难理解,在Page_Load里获取AjaxClient.aspx传递过来的CityID这个参数,然后通过这个参数的值调用下面定义的GetDistricts方法,在这方法里通过调用WebService里的方法得到查询数据库得到一个数组对象。然后在把这个数组对象解吸为XML并Response给客户端。客户端的JavaScript定义如下:

 1 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) < script type = " text/javascript " >
 2 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    // //初始化客户端控件引用
 3 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)     var  ddlCitys = document.getElementById( " <% = ddlCitys.ClientID %> " );
 4 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    var  ddlDistricts = document.getElementById( " <% = ddlDistricts.ClientID %> " );
 5 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)
 6 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)     // 初始化HttpRequest
 7 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)      var  HttpRequest  =   false ;
 8 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)     if (window.XMLHttpRequest)
 9 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)     {
10无刷新联动大烧烤(XMLHttpRequest,AJAX Library)       HttpRequest = new XMLHttpRequest();
11无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    }

12 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)     else
13 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)     {
14无刷新联动大烧烤(XMLHttpRequest,AJAX Library)       HttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
15无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    }

16 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    
17 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    resetDistrit();
18 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    
19 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)     function  getDistrictByCityID(cityID)
20 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)     {
21无刷新联动大烧烤(XMLHttpRequest,AJAX Library)       if(!HttpRequest) return;
22无刷新联动大烧烤(XMLHttpRequest,AJAX Library)       if(cityID<0return;
23无刷新联动大烧烤(XMLHttpRequest,AJAX Library)       
24无刷新联动大烧烤(XMLHttpRequest,AJAX Library)       var uri="AjaxServer.aspx?CityID="+cityID; 
25无刷新联动大烧烤(XMLHttpRequest,AJAX Library)       HttpRequest.open("GET",uri);
26无刷新联动大烧烤(XMLHttpRequest,AJAX Library)       HttpRequest.onreadystatechange=function()
27无刷新联动大烧烤(XMLHttpRequest,AJAX Library)       {
28无刷新联动大烧烤(XMLHttpRequest,AJAX Library)          if (HttpRequest.readyState == 4 && HttpRequest.status == 200)
29无刷新联动大烧烤(XMLHttpRequest,AJAX Library)          {
30无刷新联动大烧烤(XMLHttpRequest,AJAX Library)             var xml=HttpRequest.responseXML;
31无刷新联动大烧烤(XMLHttpRequest,AJAX Library)             var disctricts=xml.getElementsByTagName("District");
32无刷新联动大烧烤(XMLHttpRequest,AJAX Library)             ddlDistricts.options.length=0;
33无刷新联动大烧烤(XMLHttpRequest,AJAX Library)             
34无刷新联动大烧烤(XMLHttpRequest,AJAX Library)             for(i=0;i<disctricts.length;i++)
35无刷新联动大烧烤(XMLHttpRequest,AJAX Library)             {
36无刷新联动大烧烤(XMLHttpRequest,AJAX Library)                var value=disctricts[i].firstChild.nodeValue;
37无刷新联动大烧烤(XMLHttpRequest,AJAX Library)                var id=disctricts[i].attributes[0].value;
38无刷新联动大烧烤(XMLHttpRequest,AJAX Library)                ddlDistricts.options[i]=new Option(value,id);
39无刷新联动大烧烤(XMLHttpRequest,AJAX Library)             }

40无刷新联动大烧烤(XMLHttpRequest,AJAX Library)          }

41无刷新联动大烧烤(XMLHttpRequest,AJAX Library)          ddlDistricts.disabled=false;
42无刷新联动大烧烤(XMLHttpRequest,AJAX Library)       }

43无刷新联动大烧烤(XMLHttpRequest,AJAX Library)       HttpRequest.send(null);
44无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    }

45 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    
46 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)     function  displayResults()
47 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)     {
48无刷新联动大烧烤(XMLHttpRequest,AJAX Library)       var result="";
49无刷新联动大烧烤(XMLHttpRequest,AJAX Library)       var citys=document.getElementsByName(ddlCitys);
50无刷新联动大烧烤(XMLHttpRequest,AJAX Library)       var district=document.getElementsByName(ddlDistricts);
51无刷新联动大烧烤(XMLHttpRequest,AJAX Library)       if(ddlDistricts.selectedIndex>0)
52无刷新联动大烧烤(XMLHttpRequest,AJAX Library)       {
53无刷新联动大烧烤(XMLHttpRequest,AJAX Library)          result += ddlCitys.options[ddlCitys.selectedIndex].text +" ";
54无刷新联动大烧烤(XMLHttpRequest,AJAX Library)          result += ddlDistricts.options[ddlDistricts.selectedIndex].text; 
55无刷新联动大烧烤(XMLHttpRequest,AJAX Library)       }

56无刷新联动大烧烤(XMLHttpRequest,AJAX Library)       document.getElementById("Results").innerHTML=result;
57无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    }

58 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    
59 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)     function  resetDistrit()
60 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)     {
61无刷新联动大烧烤(XMLHttpRequest,AJAX Library)      ddlDistricts.options.length=0;
62无刷新联动大烧烤(XMLHttpRequest,AJAX Library)      ddlDistricts.disabled=true;
63无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    }

64 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) < / script>

    来分析下上面的JavaScript的定义,getDistrictByCityID方法就是通过CityID做为参数向AjaxServer.aspx发起请求,然后返回一个XML对象,然后通过getDistrictByCityID方法的回调函数来处理返回的XML,解析后把值绑定到ddlDistrict这个下拉列表控件上,这样使用XMLHttpRequest就实现了异步发起请求并处理回调的方式实现了无刷新联动。运行如下:
     无刷新联动大烧烤(XMLHttpRequest,AJAX Library)

二、使用AJAX Library实现
    这里我简单介绍下使用AJAX Library的实现,通过ScritrpManager访问WebService的方法调用方法得到一个数组对象,在客户端通过JavaScript解析数组实现,先看看WebService里的方法定义:

 1 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) [WebMethod]
 2 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) public  District[] GetDistricts( int  cityID)
 3 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) {
 4无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    List<District> list = new List<District>();
 5无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    DataTable dt = DataAccess.GetDistricts(cityID);
 6无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    foreach (DataRow row in dt.Rows)
 7无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    {
 8无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        list.Add(new District(
 9无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            int.Parse(row["DistrictID"].ToString()),
10无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            row["DistrictName"].ToString(),
11无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            int.Parse(row["CityID"].ToString())));
12无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    }

13无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    return list.ToArray();
14无刷新联动大烧烤(XMLHttpRequest,AJAX Library)}

    此方法返回一个数组到客户端,客户端通过回调函数来处理这个数组并把数据绑定到下拉列表控件上。这里同上一样先初始化一个下拉列表控件的数据:

 1 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) public   partial   class  AjajLibrary : System.Web.UI.Page
 2 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) {
 3无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    protected void Page_Load(object sender, EventArgs e)
 4无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    {
 5无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        if (!IsPostBack)
 6无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        {
 7无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            this.ddlCitys.DataSource = new WebService().GetCitys();
 8无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            this.ddlCitys.DataTextField = "CityName";
 9无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            this.ddlCitys.DataValueField = "CityID";
10无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            this.ddlCitys.DataBind();
11无刷新联动大烧烤(XMLHttpRequest,AJAX Library)
12无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            ddlCitys.Items.Insert(0new ListItem("--请选择--""0"));
13无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            this.ddlCitys.Attributes.Add("onchange""onCityChanged(this.value);");
14无刷新联动大烧烤(XMLHttpRequest,AJAX Library)            this.ddlDistricts.Attributes.Add("onchange""onDistrictChanged();");
15无刷新联动大烧烤(XMLHttpRequest,AJAX Library)        }

16无刷新联动大烧烤(XMLHttpRequest,AJAX Library)    }

17无刷新联动大烧烤(XMLHttpRequest,AJAX Library)}

引入Webservice:

1 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) < asp:ScriptManager  ID ="ScriptManager1"  runat ="server" >
2 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)   < Services >
3 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)     < asp:ServiceReference  Path ="WebService.asmx"  InlineScript ="true"   />
4 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)   </ Services >
5 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) </ asp:ScriptManager >
 1 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) < script type = " text/javascript " >
 2 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) // 初始化控件引用
 3 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) var  ddlCitys  =  $get( " <% = ddlCitys.ClientID %> " );
 4 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) var  ddlDistrict  =  $get( " <% = ddlDistricts.ClientID %> " );
 5 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)   
 6 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) var  obj = "" ;
 7 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)
 8 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) function  onCityChanged(cityID)
 9 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) {
10无刷新联动大烧烤(XMLHttpRequest,AJAX Library)   if(cityID > 0)
11无刷新联动大烧烤(XMLHttpRequest,AJAX Library)   {
12无刷新联动大烧烤(XMLHttpRequest,AJAX Library)      AjaxPattern.WebService.GetDistricts(cityID,onGetDistrictCallBack);
13无刷新联动大烧烤(XMLHttpRequest,AJAX Library)   }

14无刷新联动大烧烤(XMLHttpRequest,AJAX Library)}

15 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)
16 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) function  onDistrictChanged()
17 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) {
18无刷新联动大烧烤(XMLHttpRequest,AJAX Library)   obj += ddlCitys.options[ddlCitys.selectedIndex].text + " ";
19无刷新联动大烧烤(XMLHttpRequest,AJAX Library)   obj += ddlDistricts.options[ddlDistricts.selectedIndex].text;
20无刷新联动大烧烤(XMLHttpRequest,AJAX Library)   
21无刷新联动大烧烤(XMLHttpRequest,AJAX Library)   $get("results").innerHTML = obj;
22无刷新联动大烧烤(XMLHttpRequest,AJAX Library)}

23 无刷新联动大烧烤(XMLHttpRequest,AJAX Library)
24 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) function  onGetDistrictCallBack(dates)
25 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) {  
26无刷新联动大烧烤(XMLHttpRequest,AJAX Library)  for(var i=0;i<dates.length;i++)
27无刷新联动大烧烤(XMLHttpRequest,AJAX Library)  {
28无刷新联动大烧烤(XMLHttpRequest,AJAX Library)     var value = dates[i].DistrictName; 
29无刷新联动大烧烤(XMLHttpRequest,AJAX Library)     var id=dates[i].DistrictID;
30无刷新联动大烧烤(XMLHttpRequest,AJAX Library)     ddlDistrict.options[0]=new Option(value,id);
31无刷新联动大烧烤(XMLHttpRequest,AJAX Library)  }

32无刷新联动大烧烤(XMLHttpRequest,AJAX Library)
33无刷新联动大烧烤(XMLHttpRequest,AJAX Library)}

34 无刷新联动大烧烤(XMLHttpRequest,AJAX Library) < / script>

三、使用AjaxControlToolkit控件实现
     这部分是最简单的,在这里我就不做介绍了。有兴趣的可以查阅相关资料进行了解,官方文档里也有详细Demo.

你可能感兴趣的:(XMLhttpREquest)