小弟真的很急,因为上头要我写一个ajax的三级联动下拉框,我写了代码,在正常的页面是可以正确执行的,可是同样的代码改成用户控件就不行了。不知道问题出在哪里,代码挺长,我真的挺急,麻烦大伙帮忙解决解决。
先谢谢了。我创建的用户控件名称为“ThreeLevelDropdownList.ascx”页面上的代码是:<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ThreeLevelDropdownList.ascx.cs"
Inherits="ThreeLevelDropdownList" %>
<asp:DropDownList ID="ddl1" runat="server">
</asp:DropDownList>
<asp:DropDownList ID="ddl2" runat="server">
<asp:ListItem Text="请选择-" Value="0"></asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="ddl3" runat="server">
<asp:ListItem Text="请选择-" Value="0"></asp:ListItem>
</asp:DropDownList>
<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();
}
}
}
}}
先谢谢了。我创建的用户控件名称为“ThreeLevelDropdownList.ascx”页面上的代码是:<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ThreeLevelDropdownList.ascx.cs"
Inherits="ThreeLevelDropdownList" %>
<asp:DropDownList ID="ddl1" runat="server">
</asp:DropDownList>
<asp:DropDownList ID="ddl2" runat="server">
<asp:ListItem Text="请选择-" Value="0"></asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="ddl3" runat="server">
<asp:ListItem Text="请选择-" Value="0"></asp:ListItem>
</asp:DropDownList>
<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();
}
}
}
}}
我後來又寫了一個簡單的DEMO
發現在用戶控件中ajax無法訪問到後臺.不知道是不是請求的URL路徑不能直接這樣寫
AAJX访问后台方法
[AjaxPro.AjaxMethod]
这不行的!aspx文件或者自己写个HttpHandle
.ascx类型指的是控件,通过url如何能够访问到呢?
最简单的你可以新建个页面aspx,在PageLoad中进行数据的处理。
也就是上边你ThreeLevelDropdownList 中的Page_Load。
再试试吧!
好运! 最好再试试HttpHandle,这个是最简洁的。
ps: 我怀疑你上边代码放到页面,不用控件也是有BUG的,不知道你测试过没有
因为页面回发之后DropDownList的状态是不能自动维护的(因为是客户端通过js修改)
ViewState中是没有记录的,因此我觉得页面回发后我们需要再自己去维护值。
asp:HiddenField 上边可以做这个用!
谢谢大家的耐心回答