这是我今天做的一个例子,还来不及时间整理,先把所需的都列举出来,然后再一一详述:
这里需要注意一点
Ajax在.NET 1.1平台上后台页面里不能直接访问用Ajax填充的控件的值,要这样访问:
Request.Form.Get(this.ddlProductCategoryThird.ClientID).Trim().ToString(); //控件的值
this.ddlProductCategoryThird.ClientID //控件的ID
我的程序的功能是要实现包括三层分类的集联,而且不能刷新整个页面,其中第一层,在服务器端直接读取了
,而二三层通过Ajax实现,感觉Ajax就是一种这样的技术,也就是这样一种服务器端客户端传递数据的一种方式:
第一,在后台代码的Page_Load里注册类到Ajax,如下:
AjaxPro.Utility.RegisterTypeForAjax(typeof(SearchAdvanced));
第二,注册联动事件,就是向能激发Ajax事件的控件添加客户端事件,也在Page_Load里,如下:
//联动
this.ddlProductCategoryFirst.Attributes.Add("onchange","ProductCategorySecondList(this);");
//联动
this.ddlProductCategorySecond.Attributes.Add("onchange","ProductCategoryThirdList(this);");
第三,新建一个AjaxControl.js文件,然后包含到页面里,在里面添加脚本,如下:
/*函数功能:将控件的值传送回服务器,通过Topnamespace.SearchAdvanced.fillCategoryCode
将值传送回服务器,然后把服务器的返回值,交给callback_ProductCategorySecondList这个函数进行处理,
一般是不刷新整个页面,根据obj的选择,动态改变另一个obj1的值(或者填充值)
代码说明:Topnamespace是命名空间,SearchAdvanced是类名,fillCategoryCode是服务器端方法,
callback_ProductCategorySecondList是客户端方法,接收服务器端返回值,并处理然后动态改变obj1的值
*/
function ProductCategorySecondList(obj){//SearchAdvanced.aspx的ajax控制
var formCodeValue=obj.value;
jiajushop.SearchAdvanced.fillCategoryCode(formCodeValue,callback_ProductCategorySecondList);
}
第四,服务器端事件介绍,也就是要返回数据给Ajax的服务器端事件,如下:
/*
功能:根据客户端传来的obj的值,通过Sql返回动态的新值,也就是obj1的值,然后返回给Ajax,进行处理显示
代码说明:[AjaxPro.AjaxMethod(AjaxPro.HttpSessionStateRequirement.Read)] 这个是Ajax必须的
CategoryValue:Ajax传过来的查询条件
returnValue:返回给客户端的值
返回值说明:这里我的返回值是双层数组,a[i][0]用于填充DropDownList的Value a[i][1]用于填充
DropDownList的Text
*/
[AjaxPro.AjaxMethod(AjaxPro.HttpSessionStateRequirement.Read)]
public string fillCategoryCode(string CategoryValue)
{//绑定子分类下拉列表
string returnValue="";
try
{
DataTable dt_Child = Business.Tools.Common.GetDataDictionary("Shop_tbl_ProductInfo", "P_Classify", " Parent_Code="+CategoryValue);
for(int i=0;i<=dt_Child.Rows.Count;i++)
{
if(i==0)
{
returnValue+=""+"|"+"请选择"+",";
}
else
{
returnValue+=dt_Child.Rows[i-1]["Child_Code"].ToString()+"|"+dt_Child.Rows[i-1]["Child_Name"].ToString().Trim()+",";
}
}
return returnValue;
}
catch(Exception e)
{
e.ToString();
return returnValue;
}
}
第五,Ajax事件介绍,也就是要将服务器端返回的数据进行处理,填充obj1,如下:
/*
函数名:callback_ProductCategorySecondList
功能:将服务器端返回的数据进行处理,填充obj1
代码说明:res这个是服务器端返回给Ajax的返回值,也就是要填充的obj1的值
*/
function callback_ProductCategorySecondList(res){//SearchAdvanced.aspx的ajax控制
var result = res.value;//得到服务器返回的数据
//先清空dListChild的所有下拉项
if(result!="")//如果返回的数据不是空
{
//把收到的字符串按照,分割成数组
var allArray = result.split(",");
//循环这个数组,注意是从1开始,因为收到的字符串最后一个字符是,号,所以分割后第一个数组为空
for(var i=0;i<allArray.length-1;i++)
{
//在把这个字符串按照|分割成数组
var thisArray = allArray[i].split("|");
//为控件添加条目
document.getElementById("ddlProductCategorySecond").options.add(new Option(thisArray[1].toString(),thisArray[0].toString()));
}
document.getElementById("ddlProductCategorySecond").focus();
}
res=null;
result=null;
}
以上就是大概的Ajax流程,下面是我的整个页面及页面后台代码,还有Ajax脚本代码,可能并不完全适合于某个用户,我这里只不过是提供一个Ajax处理的思路,过了一段时间,也许我想做相关Ajax的内容是,也许会忘记的,这样对我也是一个记忆的功能。
这个是我页面中的需要集联的三个DropDownList
这部分属于前台页面:
<LI>
分 类1:
<asp:dropdownlist id="ddlProductCategoryFirst" runat="server">
<asp:ListItem Value="" Selected=True>请选择</asp:ListItem>
</asp:dropdownlist>分
类2:
<asp:dropdownlist id="ddlProductCategorySecond" runat="server">
<asp:ListItem Value="" Selected=True>请选择</asp:ListItem>
</asp:dropdownlist>分
类3:
<asp:dropdownlist id="ddlProductCategoryThird" runat="server">
<asp:ListItem Value="" Selected=True>请选择</asp:ListItem>
</asp:dropdownlist><asp:listbox id="ddlProductCategorySecond1" runat="server" Width="200px" Height="128px" SelectionMode="Multiple"
Visible="False"></asp:listbox><SELECT id="aa" style="display:none">
<OPTION selected></OPTION>
</SELECT>
<LI>
页面命名空间层次是这样的
jiajushop.SearchAdvanced
下面是页面后台代码(服务器端代码):
/// <summary>
/// 绑定第一层类别
/// </summary>
private void BindddlProductCategoryFirst()
{
DataTable dt_Parent = Business.Tools.Common.GetDataDictionary("Shop_tbl_ProductInfo", "P_Classify", "Child_Level=1");
this.ddlProductCategoryFirst.DataSource=dt_Parent;
this.ddlProductCategoryFirst.DataTextField="Child_Name";
this.ddlProductCategoryFirst.DataValueField="Child_Code";
this.ddlProductCategoryFirst.DataBind();
this.ddlProductCategoryFirst.Items.Add(new ListItem("请选择",""));
this.ddlProductCategoryFirst.SelectedIndex = this.ddlProductCategoryFirst.Items.Count-1;
}
[AjaxPro.AjaxMethod(AjaxPro.HttpSessionStateRequirement.Read)]
public string fillCategoryCode(string CategoryValue)
{//绑定子分类下拉列表
string returnValue="";
try
{
DataTable dt_Child = Business.Tools.Common.GetDataDictionary("Shop_tbl_ProductInfo", "P_Classify", " Parent_Code="+CategoryValue);
for(int i=0;i<=dt_Child.Rows.Count;i++)
{
if(i==0)
{
returnValue+=""+"|"+"请选择"+",";
}
else
{
returnValue+=dt_Child.Rows[i-1]["Child_Code"].ToString()+"|"+dt_Child.Rows[i-1]["Child_Name"].ToString().Trim()+",";
}
}
return returnValue;
}
catch(Exception e)
{
e.ToString();
return returnValue;
}
}
确定按钮读值事件
/// <summary>
/// 产品确定按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnProductOK_Click(object sender, System.EventArgs e)
{
string pstrProductKey = string.Empty;
string pstrProductBrand = string.Empty;
//string pstrProductCategory = string.Empty;
string pstrProductPriceFrom = string.Empty;
string pstrProductPriceTo = string.Empty;
string pstrProductCategoryFirst = string.Empty;
string pstrProductCategorySecond = string.Empty;
string pstrProductCategoryThird = string.Empty;
pstrProductKey = txtProductKey.Text.Trim();
pstrProductBrand = txtProductBrand.Text.Trim();
//pstrProductCategory = txtProductCategory.Text.Trim();
pstrProductPriceFrom = txtProductPriceFrom.Text.Trim();
pstrProductPriceTo = txtProductPriceTo.Text.Trim();
if(ddlProductCategoryFirst.SelectedValue!=null)
{
pstrProductCategoryFirst = ddlProductCategoryFirst.SelectedValue.ToString();
}
else
{
pstrProductCategoryFirst = string.Empty;
}
//permissionId=Request.Form.Get(this.ddlPermissionDest.ClientID).Trim();
if(Request.Form.Get(this.ddlProductCategorySecond.ClientID).Trim()!=string.Empty)
{
pstrProductCategorySecond = Request.Form.Get(this.ddlProductCategorySecond.ClientID).Trim();
}
else
{
pstrProductCategorySecond = string.Empty;
}
if(Request.Form.Get(this.ddlProductCategoryThird.ClientID).Trim()!=string.Empty)
{
pstrProductCategoryThird = Request.Form.Get(this.ddlProductCategoryThird.ClientID).Trim().ToString();
}
else
{
pstrProductCategoryThird = string.Empty;
}
if(pstrProductPriceFrom==string.Empty)
{
pstrProductPriceFrom = "0";
}
else
{
Regex reg = new Regex("^[0-9]+[.]?[0-9]+$");
Match m = reg.Match(pstrProductPriceFrom);
if(m.Success)
{
}
else
{
pstrProductPriceFrom = "0";
}
}
if(pstrProductPriceTo==string.Empty)
{
pstrProductPriceTo = "0";
}
else
{
Regex reg = new Regex("^[0-9]+[.]?[0-9]+$");
Match m = reg.Match(pstrProductPriceTo);
if(m.Success)
{
}
else
{
pstrProductPriceTo = "0";
}
}
Response.Redirect(ResolveUrl("SearchInfo/ProductSearchResult.aspx?ProductKey="+pstrProductKey+"&ProductBrand="+pstrProductBrand+"&ProductPriceFrom="+pstrProductPriceFrom+"&ProductPriceTo="+pstrProductPriceTo+"&ProductCategoryFirst="+pstrProductCategoryFirst+"&ProductCategorySecond="+pstrProductCategorySecond+"&ProductCategoryThird="+pstrProductCategoryThird));
}
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
//这的_Default是指页面类的类名。如是放在命名空间,则需要写上完整的命名空间(如:namespaces._Default)
AjaxPro.Utility.RegisterTypeForAjax(typeof(SearchAdvanced));
//联动
this.ddlProductCategoryFirst.Attributes.Add("onchange","ProductCategorySecondList(this);");
//联动
this.ddlProductCategorySecond.Attributes.Add("onchange","ProductCategoryThirdList(this);");
}
下面是我的Ajax脚本文件 需要包含的页面中:
//
function ProductCategorySecondList(obj){//SearchAdvanced.aspx的ajax控制
var formCodeValue=obj.value;
jiajushop.SearchAdvanced.fillCategoryCode(formCodeValue,callback_ProductCategorySecondList);
}
function ProductCategoryThirdList(obj){//SearchAdvanced.aspx的ajax控制
var formCodeValue=obj.value;
jiajushop.SearchAdvanced.fillCategoryCode(formCodeValue,callback_ProductCategoryThirdList);
}
function callback_ProductCategorySecondList(res){//SearchAdvanced.aspx的ajax控制
var result = res.value;//得到服务器返回的数据
//先清空dListChild的所有下拉项
if(result!="")//如果返回的数据不是空
{
//把收到的字符串按照,分割成数组
var allArray = result.split(",");
//循环这个数组,注意是从1开始,因为收到的字符串最后一个字符是,号,所以分割后第一个数组为空
for(var i=0;i<allArray.length-1;i++)
{
//在把这个字符串按照|分割成数组
var thisArray = allArray[i].split("|");
//为控件添加条目
document.getElementById("ddlProductCategorySecond").options.add(new Option(thisArray[1].toString(),thisArray[0].toString()));
}
document.getElementById("ddlProductCategorySecond").focus();
}
res=null;
result=null;
}
function callback_ProductCategoryThirdList(res){//SearchAdvanced.aspx的ajax控制
var result = res.value;//得到服务器返回的数据
//先清空dListChild的所有下拉项
if(result!="")//如果返回的数据不是空
{
//把收到的字符串按照,分割成数组
var allArray = result.split(",");
//循环这个数组,注意是从1开始,因为收到的字符串最后一个字符是,号,所以分割后第一个数组为空
for(var i=0;i<allArray.length-1;i++)
{
//在把这个字符串按照|分割成数组
var thisArray = allArray[i].split("|");
//为控件添加条目
document.getElementById("ddlProductCategoryThird").options.add(new Option(thisArray[1].toString(),thisArray[0].toString()));
}
document.getElementById("ddlProductCategoryThird").focus();
}
res=null;
result=null;
}