最近看到很多人都在问关于联动的问题,于是决定把上个项目做的联动发出来大家参考,因为当时也是在网上参考了的,若有雷同纯属正常情况。。自己写的一个用户控件,三个DROPDOWNLIST实现省市县的三级联动。话不多说,先来看代码。<%@ Control Language="C#" ClassName="AreaCode" %><script runat="server">
    bool setValue;
    protected void Page_Load(object sender, EventArgs e)
    {
        ddlProvince.Attributes["onchange"] = "Province('" + ddlProvince.ClientID + "','" + ddlCity.ClientID + "','" + ddlCounty.ClientID + "');";
        ddlCity.Attributes["onchange"] = "City('" + ddlCity.ClientID + "','" + ddlCounty.ClientID + "');";
        if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "AreaCode"))
        {
            string script = @"
                function Province(_province,_city,_county)
                {
                  var svalue = document.all(_province).value;
                  var webFileUrl = ""/Manage/Dict/AreaCode.ashx?Province="" + svalue;//这个是ASHX一般应用程序处理文件,由自己,下面我也会公布出来
                  var result = """";
                  var xmlHttp = new ActiveXObject(""MSXML2.XMLHTTP"");
                  xmlHttp.open(""GET"", webFileUrl, false);
                  xmlHttp.send("""");
                  result = xmlHttp.responseText;
                  if(result != """")
                  {
                    document.all(_city).length=0;
                    var piArray = result.split("","");
                    for(var i=0;i<piArray.length;i++)
                    {
                      var ary1 = piArray[i].toString().split(""|"");
                      document.all(_city).options.add(new Option(ary1[0].toString(),ary1[1].toString()));
                    }
                    City(_city,_county);
                  }
                  else
                  {
                    //alert(result);
                  }
                }
                //以XML求取City的数据
                function City(_city,_county)
                {
                  var svalue = document.all(_city).value;
                  var webFileUrl = ""/Manage/Dict/AreaCode.ashx?City="" + svalue;
                  var result = """";
                  var xmlHttp = new ActiveXObject(""MSXML2.XMLHTTP"");
                  xmlHttp.open(""GET"", webFileUrl, false);
                  xmlHttp.send("""");
                  result = xmlHttp.responseText;
                  
                  if(result != """")
                  {
                    document.all(_county).length=0;
                    var piArray = result.split("","");
                    for(var i=0;i<piArray.length;i++)
                    {
                      var ary1 = piArray[i].toString().split(""|"");
                      document.all(_county).options.add(new Option(ary1[0].toString(),ary1[1].toString()));
                    }
                  }
                  else
                  {
                    //alert(result);
                  }
                }";
            Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "AreaCode", script, true);
        }
        if (!setValue && !Page.IsPostBack)
        {
            ddlProvince.DataSource = global::Dict.GetProvince();
            ddlProvince.DataTextField = "Name";
            ddlProvince.DataValueField = "Code";
            ddlProvince.DataBind();
            ddlProvince.SelectedValue = "510000";            ddlCity.DataSource = global::Dict.GetCity(ddlProvince.SelectedValue);
            ddlCity.DataTextField = "Name";
            ddlCity.DataValueField = "Code";
            ddlCity.DataBind();            ddlCounty.DataSource = global::Dict.GetCounty(ddlCity.SelectedValue);
            ddlCounty.DataTextField = "Name";
            ddlCounty.DataValueField = "Code";
            ddlCounty.DataBind();
        }
    }    public string Value
    {
        get
        {
            return Request.Form[ddlCounty.ClientID.Replace("_", "$")];
        }
        set
        {
            if (string.IsNullOrEmpty(value)) return;
            if (ddlProvince.Items.Count == 0)
            {
                ddlProvince.DataSource = global::Dict.GetProvince();
                ddlProvince.DataTextField = "Name";
                ddlProvince.DataValueField = "Code";
                ddlProvince.DataBind();
            }
            ddlProvince.SelectedValue = value.Substring(0, 2) + "0000";
            ddlCity.DataSource = global::Dict.GetCity(ddlProvince.SelectedValue);
            ddlCity.DataTextField = "Name";
            ddlCity.DataValueField = "Code";
            ddlCity.DataBind();
            ddlCity.SelectedValue = value.Substring(0, 4) + "00";            ddlCounty.DataSource = global::Dict.GetCounty(ddlCity.SelectedValue);
            ddlCounty.DataTextField = "Name";
            ddlCounty.DataValueField = "Code";
            ddlCounty.DataBind();
            ddlCounty.SelectedValue = value;
            
            setValue = true;
        }
    }
</script>
<asp:DropDownList ID="ddlProvince" runat="server">
</asp:DropDownList>
<asp:DropDownList ID="ddlCity" runat="server">
</asp:DropDownList>
<asp:DropDownList ID="ddlCounty" runat="server">
</asp:DropDownList>//下面是ASHX的源码<%@ WebHandler Language="C#" Class="AreaCode" %>using System;
using System.Web;
using System.Text;
using System.Linq;
public class AreaCode : IHttpHandler {
    
    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "text/plain";
        context.Response.Clear();
        PoliceOAModel.PoliceOAEntities model = new PoliceOAModel.PoliceOAEntities();//这里是ADO.NET ENTITY 。取数据库数据的        StringBuilder sb = new StringBuilder();
        if (!string.IsNullOrEmpty(context.Request["Province"]))
        {
            foreach (PoliceOAModel.AreaCode area in global::Dict.GetCity(context.Request["Province"]))
            {
                if (sb.ToString() == "")
                {
                    sb.Append(area.Name + "|" + area.Code);
                }
                else
                {
                    sb.Append("," + area.Name + "|" + area.Code);
                }
            }
        }
        else if (!string.IsNullOrEmpty(context.Request["City"]))
        {
            foreach (PoliceOAModel.AreaCode area in global::Dict.GetCounty(context.Request["City"]))
            {
                if (sb.ToString() == "")
                {
                    sb.Append(area.Name + "|" + area.Code);
                }
                else
                {
                    sb.Append("," + area.Name + "|" + area.Code);
                }
            }
        }
        model.Dispose();
        context.Response.Write(sb.ToString());
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }}这样写的好处就是在页面赋值的时候,我只用赋值一个VALUE 就可以指定三个DROPDOWNLIST的选择项。开发过程中是很方便的。
如果大家有更好的方法,可以提出来一起学习