基于ASP.NET AJAX 的级联菜单

刚接触AJAX的时候,觉得它太神奇了,把每提交一次就要刷新、整个页面抖动一下的网页变的和桌面程序一样,不再刷新,不再抖动。

因此我对它产生了莫大的好感,我喜欢在网页中的某个角落落下它的身影。而且,它的使用是如此的简单,仅仅需要拖两个控件,就能发挥它的神奇功效,何乐而不为。

但是不久后,当我知道这种直接拖控件的方法并不是真正的局部回传,我对我原先的做法立刻产生了排斥心理,我不喜欢这种骗人眼球的东西。

 

前几天抽空看了几篇WEBCAST上的AJAX教程,收获不小,终于掌握了不用UpdatePanel控件的AJAX使用方式,虽然只是碰到了AJAX的一点门道,但至少实现了真是的局部回传。在此分享一下小小的成果。

 

  • 首先需要有级联关系的数据,简单点:这里就用物品类型表(Type)物品表(Articles)吧。
  • 确保已经安装AS.NET AJAX,新建一个空的网站,添加一个新页面。拖两个下拉列表控件(select),Body内代码如下

 

  
  
< body >
< form id ="form1" runat ="server" >
< div >
< select id ="DDLtype" name ="D1" runat ="server" >
< option ></ option >
     </select>
< select id ="DDLarticle" name ="D2" >
< option ></ option >
</ select >
</ div >
</ form >
</ body >

 

DDLtype加上runat ="server"属性,在页面载入时就获取物品类型数据。。

  • 接下来编写通过物品类型Id获取物品列表的Webservice,代码如下

 

  
  
// 以下属性必须
[System.Web.Script.Services.ScriptService]
public class WebSer : System.Web.Services.WebService
{
public WebSer()
{
}
// 如果返回类型dataset这样的复杂类型(引用套引用),需要在web。config文件中进行配置。
// Ariticle类只包含简单数据类型
[WebMethod]
public ICollection < Article > GetArticles( int typeId)
{
companyEntities ne
= new companyEntities();
var result
= from p in ne.Articles
where p.Type.Id == typeId
select
new Article
{
Id
= p.Id,
Name
= p.Name
};
return result.AsEnumerable().Cast < Article > ().ToList();
}
}

 

 

 

  • 接下来在页面中添加ScriptManager控件,并添加刚才编写的WebService的引用,之后页面代码如下

 

  
  
< body >
< form id ="form1" runat ="server" >
< asp:ScriptManager ID ="ScriptManager1" runat ="server" >
< Services >
< asp:ServiceReference Path ="WebService.asmx" />
</ Services >
</ asp:ScriptManager >
< div >
< select id ="DDLtype" name ="D1" runat ="server" >
< option ></ option >
</ select >
< select id ="DDLarticle" name ="D2" >
< option ></ option >
</ select >
</ div >
</ form >
</ body >
  • 编写JS代码,编写下拉列表的事件函数与客户端访问webService获取数据的代码

 

  
  
< script type = " text/javascript " >
// getArticles为DDLtype的onchange事件函数
function getArticles(ddl) {
var id = ddl.options[ddl.selectedIndex].value;
// WebSer为WebService的类名,
// GetArticles为WebSer类中的函数名
// getArticlesSucceed为调用成功后调用的回调函数
WebSer.GetArticles(id, getArticlesSucceed);
}
// 成功返回后,参数result应该为一个数组
function getArticlesSucceed(result) {
var ddl = document.getElementById( " DDLarticle " );
ddl.options.length
= 0 ;
for (i = 0 ; i < result.length; i ++ ) {
var option = document.createElement( " OPTION " );
// 直接通过属性访问数据
option.value = result[i].Id;
option.text
= result[i].Name;
ddl.options.add(option);
}
}
< / script>

 

 

 

搞定。。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值