最近的项目有比较多的关联分类,一开始想偷懒所以选择了Discuz中的级联下拉框,效果如图:
,
后来觉得自己做起来是简单了,但用户体验不是太理想,所以最后还是改成分成多个下拉框关联选择,当然最好是无刷新。
第一种方式:我选择了Asp.Net AJAX ToolKit中的CascadingDropDown控件
XHTML代码
1
<
asp:ScriptManager
ID
="ScriptManager1"
runat
="server"
>
</
asp:ScriptManager
>
2 < div >
3 < asp:UpdatePanel ID ="UpdatePanel1" runat ="server" >
4 < ContentTemplate >
5 < asp:DropDownList ID ="ddlProvince" runat ="server" >
6 </ asp:DropDownList >< asp:DropDownList ID ="ddlCity" runat ="server" >
7 </ asp:DropDownList >< asp:DropDownList ID ="ddlVilliage" runat ="server" >
8 </ asp:DropDownList >< ajax:CascadingDropDown ID ="CascadingDropDown2" runat ="server" TargetControlID ="ddlProvince" ServicePath ="SNWebService.asmx" ServiceMethod ="GetProvinceContents" Category ="Province" PromptText ="请选择省份" LoadingText ="省份加载中..." >
9 </ ajax:CascadingDropDown >
10 < ajax:CascadingDropDown ID ="CascadingDropDown1" runat ="server" ParentControlID ="ddlProvince" ServicePath ="SNWebService.asmx" ServiceMethod ="GetCityContents" Category ="City" TargetControlID ="ddlCity" PromptText ="请选择城市" LoadingText ="城市加载中..." >
11 </ ajax:CascadingDropDown >
12 < ajax:CascadingDropDown ID ="CascadingDropDown3" runat ="server" Category ="Villiage" LoadingText ="区县加载中..."
13 ParentControlID ="ddlCity" PromptText ="请选择区县" ServiceMethod ="GetViliageContents"
14 ServicePath ="SNWebService.asmx" TargetControlID ="ddlVilliage" >
15 </ ajax:CascadingDropDown >
16 </ ContentTemplate >
17 </ asp:UpdatePanel >
18 </ div >
2 < div >
3 < asp:UpdatePanel ID ="UpdatePanel1" runat ="server" >
4 < ContentTemplate >
5 < asp:DropDownList ID ="ddlProvince" runat ="server" >
6 </ asp:DropDownList >< asp:DropDownList ID ="ddlCity" runat ="server" >
7 </ asp:DropDownList >< asp:DropDownList ID ="ddlVilliage" runat ="server" >
8 </ asp:DropDownList >< ajax:CascadingDropDown ID ="CascadingDropDown2" runat ="server" TargetControlID ="ddlProvince" ServicePath ="SNWebService.asmx" ServiceMethod ="GetProvinceContents" Category ="Province" PromptText ="请选择省份" LoadingText ="省份加载中..." >
9 </ ajax:CascadingDropDown >
10 < ajax:CascadingDropDown ID ="CascadingDropDown1" runat ="server" ParentControlID ="ddlProvince" ServicePath ="SNWebService.asmx" ServiceMethod ="GetCityContents" Category ="City" TargetControlID ="ddlCity" PromptText ="请选择城市" LoadingText ="城市加载中..." >
11 </ ajax:CascadingDropDown >
12 < ajax:CascadingDropDown ID ="CascadingDropDown3" runat ="server" Category ="Villiage" LoadingText ="区县加载中..."
13 ParentControlID ="ddlCity" PromptText ="请选择区县" ServiceMethod ="GetViliageContents"
14 ServicePath ="SNWebService.asmx" TargetControlID ="ddlVilliage" >
15 </ ajax:CascadingDropDown >
16 </ ContentTemplate >
17 </ asp:UpdatePanel >
18 </ div >
WebService代码
1
///
<summary>
2 /// 获取省份数据
3 /// </summary>
4 /// <param name="knownCategoryValues"></param>
5 /// <param name="category"></param>
6 /// <returns></returns>
7 [WebMethod]
8 public CascadingDropDownNameValue[] GetProvinceContents( string knownCategoryValues, string category)
9 {
10 List < CascadingDropDownNameValue > provinceList = new List < CascadingDropDownNameValue > ();
11
12
13 string strSql = " Select * From Province " ;
14
15 SqlCommand sqlCmd = new SqlCommand(strSql, sqlConn);
16
17 SqlDataReader dtrProvince = sqlCmd.ExecuteReader();
18
19 while (dtrProvince.Read())
20 {
21 provinceList.Add( new CascadingDropDownNameValue(dtrProvince[ " Name " ].ToString(),dtrProvince[ " Code " ].ToString()));
22 }
23
24 dtrProvince.Close();
25
26
27 return provinceList.ToArray();
28 }
29 /// <summary>
30 /// 获取市数据
31 /// </summary>
32 /// <param name="knownCategoryValues"></param>
33 /// <param name="category"></param>
34 /// <returns></returns>
35 [WebMethod]
36 public CascadingDropDownNameValue[] GetCityContents( string knownCategoryValues, string category)
37 {
38 StringDictionary provinceList = CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues);
39
40 string strSql = " Select * From city Where ProvinceId=' " + provinceList[ " Province " ] + " ' " ;
41
42 SqlCommand sqlCmd = new SqlCommand(strSql, sqlConn);
43
44 SqlDataReader dtrCity = sqlCmd.ExecuteReader();
45
46 List < CascadingDropDownNameValue > cityList = new List < CascadingDropDownNameValue > ();
47
48 while (dtrCity.Read())
49 {
50 cityList.Add( new CascadingDropDownNameValue(dtrCity[ " Name " ].ToString(), dtrCity[ " code " ].ToString()));
51 }
52
53 dtrCity.Close();
54
55 return cityList.ToArray();
56 }
57 /// <summary>
58 /// 获取乡镇数据
59 /// </summary>
60 /// <param name="knownCategoryValues"></param>
61 /// <param name="category"></param>
62 /// <returns></returns>
63 [WebMethod]
64 public CascadingDropDownNameValue[] GetViliageContents( string knownCategoryValues, string category)
65 {
66 StringDictionary cityList = CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues);
67
68
69 string strSql = " Select * From area Where CityId=' " + cityList[ " City " ] + " ' " ;
70
71 SqlCommand sqlCmd = new SqlCommand(strSql, sqlConn);
72
73 SqlDataReader dtrViliage = sqlCmd.ExecuteReader();
74
75 List < CascadingDropDownNameValue > viliageList = new List < CascadingDropDownNameValue > ();
76
77 while (dtrViliage.Read())
78 {
79 viliageList.Add( new CascadingDropDownNameValue(dtrViliage[ " Name " ].ToString(), dtrViliage[ " id " ].ToString()));
80 }
81
82 dtrViliage.Close();
83
84 return viliageList.ToArray();
85 }
2 /// 获取省份数据
3 /// </summary>
4 /// <param name="knownCategoryValues"></param>
5 /// <param name="category"></param>
6 /// <returns></returns>
7 [WebMethod]
8 public CascadingDropDownNameValue[] GetProvinceContents( string knownCategoryValues, string category)
9 {
10 List < CascadingDropDownNameValue > provinceList = new List < CascadingDropDownNameValue > ();
11
12
13 string strSql = " Select * From Province " ;
14
15 SqlCommand sqlCmd = new SqlCommand(strSql, sqlConn);
16
17 SqlDataReader dtrProvince = sqlCmd.ExecuteReader();
18
19 while (dtrProvince.Read())
20 {
21 provinceList.Add( new CascadingDropDownNameValue(dtrProvince[ " Name " ].ToString(),dtrProvince[ " Code " ].ToString()));
22 }
23
24 dtrProvince.Close();
25
26
27 return provinceList.ToArray();
28 }
29 /// <summary>
30 /// 获取市数据
31 /// </summary>
32 /// <param name="knownCategoryValues"></param>
33 /// <param name="category"></param>
34 /// <returns></returns>
35 [WebMethod]
36 public CascadingDropDownNameValue[] GetCityContents( string knownCategoryValues, string category)
37 {
38 StringDictionary provinceList = CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues);
39
40 string strSql = " Select * From city Where ProvinceId=' " + provinceList[ " Province " ] + " ' " ;
41
42 SqlCommand sqlCmd = new SqlCommand(strSql, sqlConn);
43
44 SqlDataReader dtrCity = sqlCmd.ExecuteReader();
45
46 List < CascadingDropDownNameValue > cityList = new List < CascadingDropDownNameValue > ();
47
48 while (dtrCity.Read())
49 {
50 cityList.Add( new CascadingDropDownNameValue(dtrCity[ " Name " ].ToString(), dtrCity[ " code " ].ToString()));
51 }
52
53 dtrCity.Close();
54
55 return cityList.ToArray();
56 }
57 /// <summary>
58 /// 获取乡镇数据
59 /// </summary>
60 /// <param name="knownCategoryValues"></param>
61 /// <param name="category"></param>
62 /// <returns></returns>
63 [WebMethod]
64 public CascadingDropDownNameValue[] GetViliageContents( string knownCategoryValues, string category)
65 {
66 StringDictionary cityList = CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues);
67
68
69 string strSql = " Select * From area Where CityId=' " + cityList[ " City " ] + " ' " ;
70
71 SqlCommand sqlCmd = new SqlCommand(strSql, sqlConn);
72
73 SqlDataReader dtrViliage = sqlCmd.ExecuteReader();
74
75 List < CascadingDropDownNameValue > viliageList = new List < CascadingDropDownNameValue > ();
76
77 while (dtrViliage.Read())
78 {
79 viliageList.Add( new CascadingDropDownNameValue(dtrViliage[ " Name " ].ToString(), dtrViliage[ " id " ].ToString()));
80 }
81
82 dtrViliage.Close();
83
84 return viliageList.ToArray();
85 }
因为只是做个Demo,所以上面的代码随手很乱的写在一起,具体可以自己再封装和优化。
第二种方式:AJAX
JS代码
1
function
changetype(ptype) {
2 document.getElementById( " <%= ddlProduct.ClientID%> " ).length = 0 ;
3 $.getJSON( " Handler1.ashx?type= " + ptype, { " resultType " : " json " }, function (data) {
4 if (data != null ) {
5 var data = data.data;
6 for ( var i = 0 ; i < data.length; i ++ ) {
7 document.getElementById( " <%= ddlProduct.ClientID%> " ).options.add( new Option(data[i].TypeName, data[i].ID));
8 }
9 changetypelevel(document.getElementById( " <%= ddlProduct.ClientID%> " ).value);
10 }
11
12 });
13
14 }
15 function changetypelevel(ptypelv) {
16 document.getElementById( " <%= ddlProductLevel.ClientID%> " ).length = 0 ;
17 $.getJSON( " Handler1.ashx?typelv= " + ptypelv, { " resultType " : " json " }, function (data) {
18 if (data != null ) {
19 var data = data.data;
20 for ( var i = 0 ; i < data.length; i ++ ) {
21 document.getElementById( " <%= ddlProductLevel.ClientID%> " ).options.add( new Option(data[i].TypeName, data[i].ID));
22 }
23 }
24 });
25 }
2 document.getElementById( " <%= ddlProduct.ClientID%> " ).length = 0 ;
3 $.getJSON( " Handler1.ashx?type= " + ptype, { " resultType " : " json " }, function (data) {
4 if (data != null ) {
5 var data = data.data;
6 for ( var i = 0 ; i < data.length; i ++ ) {
7 document.getElementById( " <%= ddlProduct.ClientID%> " ).options.add( new Option(data[i].TypeName, data[i].ID));
8 }
9 changetypelevel(document.getElementById( " <%= ddlProduct.ClientID%> " ).value);
10 }
11
12 });
13
14 }
15 function changetypelevel(ptypelv) {
16 document.getElementById( " <%= ddlProductLevel.ClientID%> " ).length = 0 ;
17 $.getJSON( " Handler1.ashx?typelv= " + ptypelv, { " resultType " : " json " }, function (data) {
18 if (data != null ) {
19 var data = data.data;
20 for ( var i = 0 ; i < data.length; i ++ ) {
21 document.getElementById( " <%= ddlProductLevel.ClientID%> " ).options.add( new Option(data[i].TypeName, data[i].ID));
22 }
23 }
24 });
25 }
处理程序代码
1
public
void
ProcessRequest(HttpContext context)
2 {
3 string ptype = context.Request.Params[ " type " ];
4 string ptypelv = context.Request.Params[ " typelv " ];
5 string result,result1;
6
7 if ( ! string .IsNullOrEmpty(ptype))
8 {
9 result = ConversionRateDetail(ptype);
10 context.Response.Write(result);
11 }
12 if ( ! string .IsNullOrEmpty(ptypelv))
13 {
14 result1 = ConversionRateDetail1(ptypelv);
15
16 context.Response.Write(result1);
17 }
18 }
19
20 private string ConversionRateDetail( string type1)
21 {
22 var sb = new StringBuilder();
23 type.ID = int .Parse(type1);
24 var testlist = Business.Product.GetProductTypeList(type);
25 return " {\"data\": " + Newtonsoft.Json.JsonConvert.SerializeObject(testlist) + " } " ;
26 }
27 private string ConversionRateDetail1( string type2)
28 {
29 var sb = new StringBuilder();
30 type.ID = int .Parse(type2);
31 var testlist1 = Product.GetProductTypeList(type);
32 return " {\"data\": " + Newtonsoft.Json.JsonConvert.SerializeObject(testlist1) + " } " ;
33 }
2 {
3 string ptype = context.Request.Params[ " type " ];
4 string ptypelv = context.Request.Params[ " typelv " ];
5 string result,result1;
6
7 if ( ! string .IsNullOrEmpty(ptype))
8 {
9 result = ConversionRateDetail(ptype);
10 context.Response.Write(result);
11 }
12 if ( ! string .IsNullOrEmpty(ptypelv))
13 {
14 result1 = ConversionRateDetail1(ptypelv);
15
16 context.Response.Write(result1);
17 }
18 }
19
20 private string ConversionRateDetail( string type1)
21 {
22 var sb = new StringBuilder();
23 type.ID = int .Parse(type1);
24 var testlist = Business.Product.GetProductTypeList(type);
25 return " {\"data\": " + Newtonsoft.Json.JsonConvert.SerializeObject(testlist) + " } " ;
26 }
27 private string ConversionRateDetail1( string type2)
28 {
29 var sb = new StringBuilder();
30 type.ID = int .Parse(type2);
31 var testlist1 = Product.GetProductTypeList(type);
32 return " {\"data\": " + Newtonsoft.Json.JsonConvert.SerializeObject(testlist1) + " } " ;
33 }
如果有更好的方式,比如JQuery AJAX的(自己能力所致,试过没实现)等,请不吝赐教,谢谢!