刚接触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>
搞定。。。。
|
请发表评论