多級選擇問題的ASP實現(可以入精華嗎?)

來源:互聯網
上載者:User
精華|問題 在開發網路應用程式時,常常會遇到多級選擇的問題,即“子”一級選擇的備選項資訊依賴於“父”一級選擇的資料。例如:在一個網頁中包含兩個select輸入控制項,一個用於列表備選的國家資訊(“父”一級選擇),另一個用於列表省份資訊(“子”一級選擇)。當使用者在第一個select輸入控制項(“父”一級選擇)中選中國家後,另一個select輸入控制項(“子”一級選擇)的選項也要變為相應國家的省、州選項,而他們之間的關係動態地儲存在資料庫中。
提出問題
傳統的解決方案可以描述為:使用者選中“父”一級選擇後,通過form提交的方式,由相應的處理常式從資料庫中提取“子”一級選擇的資訊,並重新整理用戶端頁面中“子”一級選擇的資料。
採用這種方法的缺點是:
●必須編寫一個或多個ASP程式分別處理使用者的請求,程式碼品質不高;
●當級數超過兩級時,必須解決“祖父”一級的選擇資訊的儲存問題;
●每一次使用者的修改或瀏覽多級資訊,都必須重複提交以獲得多級資訊,這樣,增加了伺服器的負擔,響應速度較慢。
針對以上方案中存在的問題,筆者在實踐中找到了一種解決方案。該方法靈活應用HTML語言中的輸入控制對象hidden,當hidden中的資料量小於2K時,可一次性將多級資訊下載到用戶端,並通過伺服器端指令碼與用戶端指令碼的共同作用,直接在用戶端完成多級選擇。
解決方案
HTML語言中的輸入控制對象hidden可以通過name-value的方式儲存字串資料,而且該控制對象在用戶端介面上不可見。
利用該輸入控制,可以將資料庫中多級選擇資訊按照一定的規則編碼,分別存放在多個hidden對象中。當使用者點擊父級選項時,用戶端程式按照一定的對應關係尋找相應的hidden對象,並將hidden對象中的字串資訊解碼,重新整理子級選擇對象。
其中,伺服器端指令碼需要完成的工作是將資料庫中的多級資訊按照順序依次提取,並且將同級的資訊資料按照一定規則編碼形成字串,儲存在不同的hidden對象中;而用戶端指令碼需要完成的工作是將hidden對象中的字串資料解碼,並顯示在子級選擇對象中。
需要特別指出的是,資料的字串編碼是此種方法成功與否的一個關鍵因素,因此必須保證編碼方法正確無誤。
具體實現
下面以國家、省份兩級選擇為例,介紹在ASP中多級選擇的具體實現方法。
在SQL Server 7.0資料庫CountryDoc中存放兩級資訊的表分別為CountryName char(20)和ProvinceName char(20)。
考慮到國家名、省/州名為字串資料,且不包含字元“0”,因此在選擇編碼方法時,採用5個連續的字元“0”作為不同資料項目之間的分隔字元。編碼後的省份資料具體形式為“北京00000上海00000黑龍江00000吉林”。
<html><head>
<script language=vbscript>
dim ProvinceArr()
dim ProvinceNum ,ProvinceStr
//字串解碼,將由‘00000'分開的選項回存到相應的動態數組中
sub myStrToArray
dim i,tmpInt,tmpStr
redim ProvinceArr(ProvinceNum-1)
tmpStr=ProvinceStr
for i=0 to ProvinceNum-1 step 1
tmpInt=InStr(tmpStr,“00000”)
ProvinceArr(i)=Left(tmpStr,tmpInt-1)
tmpStr=Right(tmpStr,Len(tmpStr)-tmpInt-4)
next
end sub
  
//向省級選擇select對象中添加一個備選項
sub AddOption(OptionStr)
dim oOption
set oOption=document.createElement(“OPTION”)
oOption.value=OptionStr
oOption.text=OptionStr
form1.ProvinceList.add(oOption)
end sub
  
//清除省級選擇select對象的所有備選項(第一項除外)
sub ClearOption
dim count,i
count=form1.ProvinceList.length
if count<=1 then
exit sub
end if
for i=count-1 to 1 step -1
form1.ProvinceList.remove(i)
next
end sub
//當使用者選中國家級備選項時,更新省級備選項中的資料
sub CountryList_onChange
dim CountryName,i
//獲得國家名稱
CountryName=form1.CountryList.value
if CountryName=“none”then
exit sub
end if
//根據國家名稱尋找相應的hidden對象,並從中取出省份、州資料(字串)
for i=0 to form1.elements.length-1 step 1
if inStr(form1.elements(i).name,CountryName & “Arr”)>0 andform1.elements(i).tagName=“INPUT” then
ProvinceStr=form1.elements(i).value
end if
if form1.elements(i).tagName=“INPUT”and inStr(form1.elements(i).name,CountryName & “Num”)>0 then
ProvinceNum=form1.elements(i).value
end if
next
if ProvinceNum=0 then
exit sub
end if
//清除省級選擇中的資料(除第一項以外)
ClearOption
//字串解碼(字串形式的省級資料存放在全域變數ProvinceStr中)
myStrToArray
//重新構造省級選擇中的資料資訊
for i=0 to ProvinceNum-1 step 1
AddOption(ProvinceArr(i))
next
form1.ProvinceList.selectedIndex=0
end sub
</script>
</head>
<body>
<form name=form1>
<table align=center>
<tr><td>國家</td>
<td>省份、州</td></tr>
<tr><td><select name=CountryList>
<option value=none>_______________</option>
<%@ Language=VBScript %>
<% dim CountryArr() %>
<% i=0 %>
//提取表中的所有國家選項,並寫入國家級選擇控制項
<% sqlText=“select distinct CountryName from CountryDoc” %>
<% set rs=conn.Execute(sqlText) %>
<% do while not rs.EOF %>
<% i=i+1 %>
<% redim preserve CountryArr(i) %>
//將國家級資料寫入動態數組中
<%CountryArr(i-1)=Trim(rs(“CountryName”))%>
<optionvalue=<%=Trim(r(“CountryName”))%>>
<%=Trim(rs(“CountryName”))%></option>
<% rs.MoveNext %>
<% loop %>
<% rs.Close %>
<% CountryNum=I %>
</select>
</td><td>
<select name=ProvinceList>
<option value=none>_______________</option>
</select></td></tr></table>
//依次從動態數組中提取國家名稱,並提取對應的省級資料資訊
<% for i=0 to CountryNum-1 step 1 %>
<% temp1=CountryArr(i) %>
<% ProvinceNum=0 %>
<% sqlText=“select count(*) as RecordNum from CountryDoc where CountryName=‘“& temp1 & ”’” %><% set rs=conn.Execute(sqlText) %>
<% ProvinceNum=rs(“RecordN



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.