按照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: & nbsp; & nbsp; & nbsp; & nbsp; < 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 >