小弟真的很急,因为上头要我写一个ajax的三级联动下拉框,我写了代码,在正常的页面是可以正确执行的,可是同样的代码改成用户控件就不行了。不知道问题出在哪里,代码挺长,我真的挺急,麻烦大伙帮忙解决解决。
先谢谢了。我创建的用户控件名称为“ThreeLevelDropdownList.ascx”页面上的代码是:<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ThreeLevelDropdownList.ascx.cs"
    Inherits="ThreeLevelDropdownList" %>
<asp:DropDownList ID="ddl1" runat="server">
</asp:DropDownList>
&nbsp;&nbsp;
<asp:DropDownList ID="ddl2" runat="server">
    <asp:ListItem Text="请选择-" Value="0"></asp:ListItem>
</asp:DropDownList>
&nbsp;&nbsp;
<asp:DropDownList ID="ddl3" runat="server">
    <asp:ListItem Text="请选择-" Value="0"></asp:ListItem>
</asp:DropDownList>
&nbsp;&nbsp;<br />
<asp:HiddenField ID="hdf1" runat="server" />
<asp:HiddenField ID="hdf2" runat="server" />
<asp:HiddenField ID="hdf3" runat="server" /><script type="text/javascript">      
          //XMLHttpRequest對象
          var req;
          
          //json對象
          var json;
          
          //傳進來的下拉框的名称
          var dropDown;
          
           //显示分类列表 sid是当前下拉框选中项的值,obj是下级下拉框的名称
         function showNext(sid,obj)
         {
            if(sid==null || sid=="" || sid.length<1)return;
            dropDown=obj;
            
            //初始一个XMLHttpRequest对象
            req=createXMLHttpRequest();
            
            req.open("POST", "ThreeLevelDropdownList.ascx");
            req.onreadystatechange = processResponse;
            req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");   
            req.send("dnewid="+sid);
            
           
          }
          
            //AJAX请求成功返回后的处理函数
          function processResponse(){
                if (req.readyState == 4 && req.status == 200) 
            { 
                var slt =getBid(dropDown);
            var result = req.responseText;
            if(result!="")
            {
                json=eval(result);//转化json对象
                
                //清空下级下拉框
                slt.length=0;
                
                //設置下级下拉框初始值
                slt[0]=new Option("請選擇-",-1);
                
                 var i=1;
                 for(var item in json)//绑定下级下拉框的项
                         {
                                slt[i]=new Option(json[item].infoName,json[item].infoID);
                                i++;
                         }             }
             
            }
           }
           
        //創建XMLHttpRequest函數  
          function createXMLHttpRequest(){
                if(window.XMLHttpRequest)
                return new XMLHttpRequest();
                try {return new ActiveXObject("Msxml2.XMLHTTP");} 
                catch (e){
            try{return new ActiveXObject("Microsoft.XMLHTTP");} 
            catch (e) {return null;}
                }
          }
          
         //常用JS函数
         function getBid(s){
             return document.getElementById(s);
         }
         function getBmc(s){
             return document.getElementByName(s);
         }
          
         
        
            
            //保留Select中选择的值
            function selectValue(sid,obHdf)
            {      
              getBid(obHdf).value=sid;    
            }</script>后台的代码是:using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
using System.Text;public partial class ThreeLevelDropdownList : System.Web.UI.UserControl
{
    /// <summary>
    /// 一级下拉框选中的值
    /// </summary>
    public string selValue1
    {
        get { return hdf1.Value; }    }
    /// <summary>
    /// 二级下拉框选中的值
    /// </summary>
    public string selValue2
    {        get { return hdf2.Value; }    }
    /// <summary>
    /// 三级下拉框选中的值
    /// </summary>
    public string selValue3
    {
        get { return hdf3.Value; }    }    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {            ddl1.Attributes.Add("onchange", "showNext(this.options[selectedIndex].value,'" + ddl2.ClientID + "');selectValue(this.options[selectedIndex].value,'" + hdf1.ClientID + "');");
            ddl2.Attributes.Add("onchange", "showNext(this.options[selectedIndex].value,'" + ddl3.ClientID + "');selectValue(this.options[selectedIndex].value,'" + hdf2.ClientID + "');");
            ddl3.Attributes.Add("onchange", "selectValue(this.options[selectedIndex].value,'" + hdf3.ClientID + "');");            ddl1.Items.Add(new ListItem("请选择-", "0"));
            using (SqlConnection conn = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=DropDownListDB;Integrated Security=True"))
            {
                DataTable dt = new DataTable();
                SqlCommand cmd = new SqlCommand("select * from info where pid is null", conn);
                conn.Open();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
                if (dt.Rows.Count > 0)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        ddl1.Items.Add(new ListItem(dr["infoName"].ToString(), dr["infoID"].ToString()));
                    }
                }
                ddl1.SelectedValue = "0";
            }
        }
        
        //按选中项的值,从数据库中取出数据按如下格式生成json文本串
        //[{"infoID":1,"infoName":"三明市","pID":null},{"infoID":2,"infoName":"厦门市","pID":null}]
        if (Request["dnewid"] != null)
        {
            using (SqlConnection conn = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=DropDownListDB;Integrated Security=True"))
            {
                DataTable dt = new DataTable();
                SqlCommand cmd = new SqlCommand("select * from info where pid='" + Request["dnewid"] + "'", conn);
                conn.Open();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
                if (dt.Rows.Count > 0)
                {
                    StringBuilder resultString = new StringBuilder();
                    resultString.Append("[");
                    foreach (DataRow dr in dt.Rows)
                    {
                        resultString.Append("{");
                        resultString.Append(String.Format("'infoID':'{0}','infoName':'{1}','pID':'{2}'", dr["infoID"].ToString(), dr["infoName"].ToString(), dr["pID"].ToString()));
                        resultString.Append("},");
                    }
                    resultString.Remove(resultString.Length - 1, 1);
                    resultString.Append("]");
                    Response.Clear();
                    Response.Write(resultString.ToString());
                    Response.End();
                }
            }
        }
           }}

解决方案 »

  1.   

    就是沒有反應.
    我後來又寫了一個簡單的DEMO
    發現在用戶控件中ajax無法訪問到後臺.不知道是不是請求的URL路徑不能直接這樣寫
      

  2.   

    onchange函数是否存在
    AAJX访问后台方法
    [AjaxPro.AjaxMethod]  
      

  3.   

    我也是遇到这样的问题,根本不会自动访问webservices。求解
      

  4.   

    老大.你请求的地址为ThreeLevelDropdownList.ascx
    这不行的!aspx文件或者自己写个HttpHandle
    .ascx类型指的是控件,通过url如何能够访问到呢?
    最简单的你可以新建个页面aspx,在PageLoad中进行数据的处理。
    也就是上边你ThreeLevelDropdownList 中的Page_Load。
    再试试吧!
    好运!  最好再试试HttpHandle,这个是最简洁的。
    ps:  我怀疑你上边代码放到页面,不用控件也是有BUG的,不知道你测试过没有
          因为页面回发之后DropDownList的状态是不能自动维护的(因为是客户端通过js修改)
          ViewState中是没有记录的,因此我觉得页面回发后我们需要再自己去维护值。
          asp:HiddenField 上边可以做这个用!
      

  5.   

    嗯。是的。。我这个方法是不行的,但是,url是可以访问的,用js取地址。
    谢谢大家的耐心回答