使用Ajax实现动态双组合功能(asp.net)

本文介绍了一个使用Ajax技术实现的动态双组合功能示例,通过地区选择自动更新对应的城市选项。该示例基于Northwind数据库的Territories表,并详细展示了前端与后端的实现代码。
1<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2<htmlxmlns="http://www.w3.org/1999/xhtml">
3<head>
4<title>使用Ajax实现动态双组合功能</title>
5<scripttype="text/javascript"src="doubleCombo.js"></script>
6<scripttype="text/javascript">
7functioninjectComponentBehaviors()
8{
9newDoubleCombo("region","territory","DoubleCombo.aspx");
10}

11
</script>
12</head>
13<bodyonload="injectComponentBehaviors()">
14<formid="form1"action="">
15示例:使用Ajax实现动态双组合功能(数据来自Northwind的Territories表)<br/>
16<br/>
17地区:<selectid="region"name="region">
18<optionvalue="-1">PickARegion</option>
19<optionvalue="1">Eastern</option>
20<optionvalue="2">Western</option>
21<optionvalue="3">Northern</option>
22<optionvalue="4">Southern</option>
23</select>
24&nbsp;&nbsp;<br/>
25<br/>
26城市:<selectid="territory"name="territory"style="width:200px"></select>
27</form>
28</body>
29</html>
30
doubleCombo.js 文件:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1//doubleCombo.js文件
2//net.ContentLoader负责创建xmlHttpRequest对象,从DoubleCombo对象中获取
3//参数并向服务器发送异步请求;
4//DoubleCombo对象负责根据从服务器端返回的XML文档对选择框内容予以更新
5
6//DoubleCombo对象
7DoubleCombo=function(masterId,slaveId,url)
8{
9this.master=document.getElementById(masterId);
10this.slave=document.getElementById(slaveId);
11this.ajaxHelper=newnet.ContentLoader(this,url,"POST");
12this.initiallizeBehavior();
13}

14
15DoubleCombo.prototype=
16{
17initiallizeBehavior:function()
18{
19varoThis=this;
20this.master.onchange=function()
21{
22variCurrentIndex=oThis.master.selectedIndex;
23if(parseInt(iCurrentIndex)!=0)
24{
25varquery=oThis.master.options[iCurrentIndex].value;
26oThis.ajaxHelper.sendRequest("regionid="+query);
27}

28}

29}
,
30
31ajaxUpdate:function(request)
32{
33varslaveOptions=this.createOptions(request.responseXML.documentElement);
34this.slave.length=0;
35for(vari=0;i<slaveOptions.length;i++)
36{
37try
38{
39this.slave.add(slaveOptions[i],null);
40}

41catch(oError)
42{
43this.slave.add(slaveOptions[i],-1);
44}

45}

46}
,
47
48createOptions:function(ajaxResponse)
49{
50varnewOptions=newArray();
51varentries=ajaxResponse.getElementsByTagName("entry");
52for(vari=0;i<entries.length;i++)
53{
54vartext=this.getElementContent(entries[i].childNodes[0]);
55varvalue=this.getElementContent(entries[i].childNodes[1]);
56newOptions.push(newOption(text,value));
57}

58returnnewOptions;
59}
,
60
61//针对IE和Mozilla的不同处理
62getElementContent:function(element)
63{
64return(element.text!=undefined)?element.text:element.textContent;
65}

66}

67
68varnet=newObject();
69net.ContentLoader=function(component,url,method)
70{
71//Component对象的方法负责更新控件及处理出错
72this.component=component;
73this.url=url;
74this.method=method;
75}

76
77net.ContentLoader.prototype=
78{
79//获取xmlHttpRequest对象
80getTransport:function()
81{
82vartransport;
83//针对Mozilla
84if(window.XMLHttpRequest)
85{
86transport=newXMLHttpRequest();
87}

88//针对IE
89elseif(window.ActiveXObject)
90{
91varxmlVersions=["MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0",
92"MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
93for(vari=0;i<xmlVersions.length;i++)
94{
95try
96{
97transport=newActiveXObject(xmlVersions[i]);
98}

99catch(oError)
100{
101
102}

103}

104}

105returntransport;
106}
,
107
108//向服务器发送请求的方法
109sendRequest:function(arg)
110{
111varrequest=this.getTransport();
112request.open(this.method,this.url,true);
113request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
114varoThis=this;
115request.onreadystatechange=function()
116{
117oThis.handleAjaxResponse(request);
118}
;
119request.send(arg);
120}
,
121
122//Ajax的响应方法
123handleAjaxResponse:function(request)
124{
125if(request.readyState==4)
126{
127if(request.status==0||(request.status>=200&&request.status<300))
128{
129this.component.ajaxUpdate(request);
130}

131else
132{
133//出现错误,写系统日志
134}

135}

136}

137}

138
139
140
DoubleCombo.aspx文件代码:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1usingSystem;
2usingSystem.Data;
3usingSystem.Configuration;
4usingSystem.Collections;
5usingSystem.Web;
6usingSystem.Web.Security;
7usingSystem.Web.UI;
8usingSystem.Web.UI.WebControls;
9usingSystem.Web.UI.WebControls.WebParts;
10usingSystem.Web.UI.HtmlControls;
11usingSystem.Xml;
12usingSystem.Data.SqlClient;
13
14publicpartialclassDoubleCombo:System.Web.UI.Page
15{
16protectedvoidPage_Load(objectsender,EventArgse)
17{
18Response.ContentType="text/xml";
19Response.Charset="utf-8";
20stringstrRegionId=Request.Form["regionid"];
21stringstrSql="selectTerritoryDescription,TerritoryIDfromTerritorieswhereregionid='"+strRegionId+"'orderbyTerritoryDescription";
22DataTabledtOptions=FillDataTable(strSql);
23XmlDocumentxmlDoc=CreateXMLDoc(dtOptions);
24Response.Clear();
25Response.Write(xmlDoc.InnerXml);
26Response.End();
27}

28
29publicXmlDocumentCreateXMLDoc(DataTabledt)
30{
31XmlDocumentxmlDoc=newXmlDocument();
32XmlDeclarationxmldecl=xmlDoc.CreateXmlDeclaration("1.0","utf-8","no");
33xmlDoc.AppendChild(xmldecl);
34XmlElementeRoot=xmlDoc.CreateElement("selectChoice");
35xmlDoc.AppendChild(eRoot);
36XmlDocumentFragmentxmlFrage=xmlDoc.CreateDocumentFragment();
37foreach(DataRowrowindt.Rows)
38{
39XmlElementeSelectElement=xmlDoc.CreateElement("entry");
40eSelectElement.InnerXml="<optionText>"+row["TerritoryDescription"]+"</optionText>";
41eSelectElement.InnerXml+="<optionValue>"+row["TerritoryID"]+"</optionValue>";
42xmlFrage.AppendChild(eSelectElement);
43}

44eRoot.AppendChild(xmlFrage);
45returnxmlDoc;
46}

47
48publicDataTableFillDataTable(stringstrSql)
49{
50stringstrConn="server=localhost;database=NorthWind;uid=sa;pwd=;";
51DataSetds=newDataSet();
52newSqlDataAdapter(strSql,strConn).Fill(ds);
53returnds.Tables[0];
54}

55}

56
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值