使用帶有 CascadingDropDown (VB) 的自動回貼

作者 :克里斯蒂安·溫茲

下載 PDF

AJAX 控制工具包中的 CascadingDropDown 控制項是用來擴充 DropDownList 控制項的,其功能是當一個下拉清單發生變更時,可載入另一個下拉清單的相關值。 然而,當使用 CascadingDropDown 控制項時,ASP.NET 的 DropDownList 控制項中的 AutoPostBack 功能無法運作,因為非同步載入資料會產生(不必要的)回貼。 使用部分 JavaScript 程式碼時,可以避免此現象。

概觀

AJAX 控制工具包中的 CascadingDropDown 控制項是用來擴充 DropDownList 控制項的,其功能是當一個下拉清單發生變更時,可載入另一個下拉清單的相關值。 (例如,一個清單提供美國各州的清單,下一個清單則填入該州的主要城市。)然而,當使用 CascadingDropDown 控制項時,ASP.NET 的 DropDownList 控制項中的 AutoPostBack 功能無法運作,因為非同步載入資料會產生(不必要的)回貼。 使用部分 JavaScript 程式碼時,可以避免此現象。

Steps

為了啟用 ASP.NET AJAX 及控制工具包的功能, ScriptManager 控制項必須放置在頁面上的任何位置(但不在元素 <form> 內):

<asp:ScriptManager ID="asm" runat="server" />

接著,需要一個下拉清單控制項:

<div>
 Vendor: <asp:DropDownList ID="VendorsList" runat="server"/>
</div>

在此列表中,新增 CascadingDropDown 擴充控制項,提供網路服務的 URL 與方法資訊:

<ajaxToolkit:CascadingDropDown ID="ccd1" runat="server"
 ServicePath="CascadingDropdown3.vb.asmx" ServiceMethod="GetVendors"
 TargetControlID="VendorsList" Category="Vendor" />

CascadingDropDown Extender 接著非同步呼叫一個具有以下方法簽名格式的網路服務:

Public Function MethodNameHere(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()

該方法回傳一個 CascadingDropDown 型別的值的陣列。 型別的建構子首先預期清單條目的說明文字,然後是值(HTML value 屬性)。

<%@ WebService Language="VB" Class="CascadingDropDown3" %>
Imports System.Web.Script.Services
Imports AjaxControlToolkit
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Collections.Generic
<ScriptService()> _
Public Class CascadingDropDown3
 Inherits System.Web.Services.WebService
 <WebMethod()> _
 Public Function GetVendors(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
 Dim l As New List(Of CascadingDropDownNameValue)
 l.Add(New CascadingDropDownNameValue("International", "1"))
 l.Add(New CascadingDropDownNameValue("Electronic Bike Repairs & Supplies","2"))
 l.Add(New CascadingDropDownNameValue("Premier Sport, Inc.", "3"))
 Return l.ToArray()
 End Function
End Class

在瀏覽器載入頁面後,下拉清單會填滿三個廠商,第二個會預先選定。 此外,ASP.NET 定義了 __doPostBack() JavaScript 方法。 頁面載入後,這個 JavaScript 呼叫會被加入下拉選單,但前提是該清單中有元素。 如果清單中沒有元素,控制工具包正在載入它們,因此 JavaScript 程式碼會使用逾時,並在半秒內重新嘗試。

<script type="text/javascript">
 function pageLoad()
 {
 addAutoPostBack();
 }
 function addAutoPostBack()
 {
 if ($get("VendorsList").options.length > 0)
 {
 $get("VendorsList").setAttribute("onchange","javascript:setTimeout('__doPostBack(\\'VendorsList\\',\\'\\')', 0)");
 }
 else
 {
 setTimeout("addAutoPostBack()", 500);
 }
 }
</script>

這樣一來,回貼只有在清單中實際有元素且使用者選擇條目時才會執行。

選擇清單元素會產生回貼

選擇清單元素會產生回貼(點擊查看全尺寸圖片)