在開發(fā)網(wǎng)絡(luò)應(yīng)用程序時,常常會遇到多級選擇的問題,即“子”一級選擇的備選項信息依賴于“父”一級選擇的數(shù)據(jù)。例如:在一個網(wǎng)頁中包含兩個select輸入控件,一個用于列表備選的國家信息(“父”一級選擇),另一個用于列表省份信息(“子”一級選擇)。當(dāng)用戶在第一個select輸入控件(“父”一級選擇)中選中國家后,另一個select輸入控件(“子”一級選擇)的選項也要變?yōu)橄鄳?yīng)國家的省、州選項,而他們之間的關(guān)系動態(tài)地保存在數(shù)據(jù)庫中。 提出問題 傳統(tǒng)的解決方法可以描述為:用戶選中“父”一級選擇后,通過form提交的方式,由相應(yīng)的處理程序從數(shù)據(jù)庫中提取“子”一級選擇的信息,并刷新客戶端頁面中“子”一級選擇的數(shù)據(jù)。 采用這種方法的缺點是: ●必須編寫一個或多個ASP程序分別處理用戶的請求,程序代碼質(zhì)量不高; ●當(dāng)級數(shù)超過兩級時,必須解決“祖父”一級的選擇信息的保存問題; ●每一次用戶的修改或瀏覽多級信息,都必須重復(fù)提交以獲得多級信息,這樣,增加了服務(wù)器的負(fù)擔(dān),響應(yīng)速度較慢。 針對以上方案中存在的問題,筆者在實踐中找到了一種解決方法。該方法靈活應(yīng)用HTML語言中的輸入控制對象hidden,當(dāng)hidden中的數(shù)據(jù)量小于2K時,可一次性將多級信息下載到客戶端,并通過服務(wù)器端腳本與客戶端腳本的共同作用,直接在客戶端完成多級選擇。 解決方法 HTML語言中的輸入控制對象hidden可以通過name-value的方式存儲字符串?dāng)?shù)據(jù),而且該控制對象在客戶端界面上不可見。 利用該輸入控制,可以將數(shù)據(jù)庫中多級選擇信息按照一定的規(guī)則編碼,分別存放在多個hidden對象中。當(dāng)用戶點擊父級選項時,客戶端程序按照一定的對應(yīng)關(guān)系查找相應(yīng)的hidden對象,并將hidden對象中的字符串信息解碼,刷新子級選擇對象。 其中,服務(wù)器端腳本需要完成的工作是將數(shù)據(jù)庫中的多級信息按照順序依次提取,并且將同級的信息數(shù)據(jù)按照一定規(guī)則編碼形成字符串,存儲在不同的hidden對象中;而客戶端腳本需要完成的工作是將hidden對象中的字符串?dāng)?shù)據(jù)解碼,并顯示在子級選擇對象中。 需要特別指出的是,數(shù)據(jù)的字符串編碼是此種方法成功與否的一個關(guān)鍵因素,因此必須保證編碼方法正確無誤。 具體實現(xiàn) 下面以國家、省份兩級選擇為例,介紹在ASP中多級選擇的具體實現(xiàn)方法。 在SQL Server 7.0數(shù)據(jù)庫CountryDoc中存放兩級信息的表分別為CountryName char(20)和ProvinceName char(20)。 考慮到國家名、省/州名為字符串?dāng)?shù)據(jù),且不包含字符“0”,因此在選擇編碼方法時,采用5個連續(xù)的字符“0”作為不同數(shù)據(jù)項之間的分隔符。編碼后的省份數(shù)據(jù)具體形式為“北京00000上海00000黑龍江00000吉林”。
%>%>%>%>%>%>%>%>%>%>%>%>%>%>%>%>%>%> 以上代碼在NT 4.0+IIS 4.0+SQL Server 7.0+IE 5.0環(huán)境中運行通過。 由于整個工作都在一個ASP程序中完成,并且所有數(shù)據(jù)一次性下載到客戶端,用戶選擇時不存在“祖父”一級的選擇信息的保存問題(沒有刷新的工作)。 小 結(jié) 如果數(shù)據(jù)量不大的話,采用本文介紹的方法是可行的。但是當(dāng)一個hidden中存儲的數(shù)據(jù)量超過2K時,受到HTML語言的自身限制,可能會存在hidden對象中數(shù)據(jù)丟失或缺少的問題,此時建議仍采用表單提取的方法來完成多級選擇。
|