按照AJAX.NET教程提供的步驟,雖然很快就能得到結果。
但如果不小心對案例改動了一些地方,就很容易使整個案例無法正常顯示。
這些小小的改動,在很多時候,是很難注意到其影響的。
(1) Web Method的簽名一定不能修改
public CascadingDropDownNameValue[] GetDropDownContents(string knownCategoryValues, string category)
本來我以爲參數的名字那些也是可以修改的,但如果把knownCategoryValues的參數名改成其它(如knownCategoryValues_Changed),最後的界面上是不能認出這個方法的
(2) 注意XML數據文件的大小寫,應該採用小寫的結點名字
如在本例中的<province name="GuangDong">,如果將該數據寫成<Province name="GuangDong">,那麼即使你在cascadingdropdown的Category屬性值和Web Method中的Hierarchy屬性值寫成"Province",也不能夠正確地取到結果,而是會產生以下的沒有數據源的頁面
因爲在CascadingDropDown.QuerySimpleCascadingDropDownDocument方法執行的時候,會把當前的XPath路徑轉換成小寫進行查找,即如果當前的XPath爲"/Example/Province",在這個方法中,會被轉換成"/Example/province",而用這個XPath是無法在XML數據文件中取得結點的。所以必須把XML數據文件中的結點的名字寫成小寫。
(3) Hierarchy屬性中應該採用小寫的名字,如把string[] Hierarchy{get{return new string[]{"province"};}}寫成string[] Hierarchy{get{return new string[]{"Province"};}},則會造成二級目錄無法讀取的情況。因爲在CascadingDropDown.QuerySimpleCascadingDropDownDocument方法中,是用Hierarchy屬性中的值來生成XPath查找的,奇怪的是這時候生成的XPath卻沒有將Hierarchy轉成小寫(這種STYLE好奇怪,呵呵)。
以上三個地方都是很容易被忽視的小地方,但卻讓人覺得莫明其妙,而且在出現錯誤的時候不知根源在哪。當然,你可以修改AjaxToolKit的源代碼來把這些煩的小錯誤去掉。
代碼一:Web Service的代碼
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class Example : System.Web.Services.WebService {
private static XmlDocument _document;
private static object _lock = new object();
public static XmlDocument Document
{
get
{
if (_document == null)
{
lock (_lock)
{
_document = new XmlDocument();
_document.Load(HttpContext.Current.Server.MapPath("~/App_Data/Example.xml"));
}
}
return _document;
}
}
public static string[] Hierarchy
{
get
{
return new string[]{"province"};
}
}
[WebMethod()]
public CascadingDropDownNameValue[] GetDropDownContents(string knownCategoryValues, string category)
{
StringDictionary knownCategoryDictionary =
CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues);
return CascadingDropDown.QuerySimpleCascadingDropDownDocument(
Document, Hierarchy, knownCategoryDictionary, category);
}
}
代碼二:頁面的代碼:
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>無標題頁</title>
</head>
<body>
<form id="form1" runat="server">
<cc1:ToolkitScriptManager ID="ScriptManager1" runat="Server">
</cc1:ToolkitScriptManager>
<div>
Province:
<asp:DropDownList ID="DropDownList1" runat="server" Width="246px">
</asp:DropDownList><br />
City: <asp:DropDownList ID="DropDownList2" runat="server"
Width="245px">
</asp:DropDownList><br />
<br />
<cc1:cascadingdropdown id="CascadingDropDown1" runat="server" category="province"
loadingtext="[Loading Province...]" prompttext="Please select the province."
servicemethod="GetDropDownContents" servicepath="Example.asmx" targetcontrolid="DropDownList1">
</cc1:cascadingdropdown>
</div>
<cc1:cascadingdropdown id="CascadingDropDown2" runat="server" category="city" loadingtext="[Loading City...]"
parentcontrolid="DropDownList1" prompttext="Please select the city." servicemethod="GetDropDownContents"
servicepath="Example.asmx" targetcontrolid="DropDownList2"></cc1:cascadingdropdown>
</form>
</body>
</html>
代碼三:XML數據文件
<example>
<province name="GuangDong">
<city name="GuangZhou" />
<city name="ZhongShan" />
<city name="MeiZhou"/>
</province>
<province name="BeiJing">
<city name="BeiJing"/>
</province>
</example>