关于Ajax

这是我今天做的一个例子,还来不及时间整理,先把所需的都列举出来,然后再一一详述:

这里需要注意一点

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>
              分&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类1:
              <asp:dropdownlist id="ddlProductCategoryFirst" runat="server">
              <asp:ListItem Value="" Selected=True>请选择</asp:ListItem>
              </asp:dropdownlist>分&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              类2:
              <asp:dropdownlist id="ddlProductCategorySecond" runat="server">
              <asp:ListItem Value="" Selected=True>请选择</asp:ListItem>
              </asp:dropdownlist>分&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              类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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值