使用自動回傳與 CascadingDropDown (C#)

作者 :一個是一個

下載 PDF

AJAX 控制項工具組中的 CascadingDropDown 控制項會擴充 DropDownList 控制項,讓一個 DropDownList 中的變更載入另一個 DropDownList 中的相關聯值。 不過,使用 CascadingDropDown 控制項時,ASP。NET 的 DropDownList 控制項 AutoPostBack 功能無法運作,因為以非同步方式將資料載入清單中會產生 (不必要的) 回傳本身。 使用某些 JavaScript 程式碼時,可以避免此效果。

概觀

AJAX 控制項工具組中的 CascadingDropDown 控制項會擴充 DropDownList 控制項,讓一個 DropDownList 中的變更載入另一個 DropDownList 中的相關聯值。 (例如,一個清單提供美國州清單,而下一個清單接著會填入該州的主要城市。) 不過,使用 CascadingDropDown 控制項時,ASP。NET 的 DropDownList 控制項 AutoPostBack 功能無法運作,因為以非同步方式將資料載入清單中會產生 (不必要的) 回傳本身。 使用某些 JavaScript 程式碼時,可以避免此效果。

步驟

若要啟用 ASP.NET AJAX 和 Control Toolkit 的功能, ScriptManager 控制項必須放在頁面上 (但 <form> 位於 元素內) :

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

然後,需要 DropDownList 控制項:

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

針對此清單,會新增 CascadingDropDown 擴充器,並提供 Web 服務 URL 和方法資訊:

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

CascadingDropDown 擴充器接著會以下列方法簽章非同步呼叫 Web 服務:

public CascadingDropDownNameValue[] MethodNameHere(string knownCategoryValues, string category)

方法會傳回 CascadingDropDown 數值型別的陣列。 類型的建構函式會先預期清單專案的標題,然後再 (HTML value 屬性的值) 。

<%@ WebService Language="C#" Class="CascadingDropdown3" %>
using System.Web.Script.Services;
using AjaxControlToolkit;
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Collections.Generic;
[ScriptService]
public class CascadingDropdown3 : System.Web.Services.WebService
{
 [WebMethod]
 public CascadingDropDownNameValue[] GetVendors(string knownCategoryValues, 
 string category)
 {
 List<CascadingDropDownNameValue> l = new List<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();
 }
}

在瀏覽器中載入頁面時,會以三個廠商填入下拉式清單,第二個廠商會預先選取。 此外,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>

如此一來,只有在清單中實際有元素且使用者選取專案時,才會執行回傳。

選取清單專案會導致回傳

選取清單元素會導致回傳 (按一下即可檢視完整大小的影像)