三、例1—把HTML ListView控件绑定到一个Web服务
(一)设计WEB页面
首先,请注意这个例子与第一部分的那个例子存在很大的相似之处。但是,在此我们将详细分析第一个例子中所没有涉及到的许多问题。现在,请启动Visual Studio 2005并选择模板“ASP.NET AJAX CTP-Enabled Web Site”创建一个新的网站并命名为ListEmployees。下图2展示了这个例子的设计时刻界面。
![]() |
| 图2:示例程序的设计时刻界面 |
在这个例子中,我们将仍然使用一个ListView控件来显示一个雇员列表信息;所有这些都是在系统启动后自动完成的。现在,根据前面分析的步骤开始进行操作。
1.设计WEB页面
列表2
|
//……省略 <link rel="stylesheet" type="text/css" href="site.css" /> //……omitted <span style="font-size: 24pt; color: #6600cc"> <strong>Employee Info Searching Results:</strong> </span> <div id="header"> <span > <strong>EmpID</strong> </span> <span > <strong>Name</strong> </span> <span> <strong>Address</strong> </span> </div> <hr style="width: 457px" align="left" />
<div id="searchResults"> </div> <div style="visibility:hidden;display: none;"> <div id="searchResults_layoutTemplate"> <div id="searchResults_itemTemplate" > <span id="searchResults_ID"></span>
<span id="searchResults_Name"></span> <span id="searchResults_Address"></span> </div> <div id="searchResults_separatorTemplate"
class="TaskSeparator"> </div> </div> <div id="NoDataTemplate">Waiting...</div> </div>
|
在此,我们首先使用了一个固定行(通过一个div块包装)用作下面将列出雇员记录数据的头标题部分。然后,我们构建相应于MS AJAX客户端控件ListView的各种模板的HTML元素。注意,我们也使用了separatorTemplate模板来分离相邻的两条记录。正如在第一部分中所提到的,控件ListView是以AJAX异步的方式来显示记录数据的。为此,我们也使用了emptyTemplate模板—NoDataTemplate以便当数据正从WebService处加载时给用户一种友好的提示。
2.创建相应的MS AJAX客户端控件
在此,我们只创建了一个MS AJAX客户端控件ListView来匹配HTML元素(一组div元素)并使其每一个模板相应于不同的div元素。此外,我们还定义了三个label元素以匹配上面的三个span元素。
(二)创建Web服务
右击工程并且选择“添加新项”,然后创建一个新的Web服务,并命名为EmployeeDataService.asmx。注意,我们还要使这个Web服务派生自DataService,然后创建四个相应于典型的数据库操作CRUD的WebMethod。下面展示了相应的关键代码:
列表3
广州网站建设,网站建设,广州网页设计,广州网站设计
|
//…… using System.ComponentModel; using System.Web.Script.Services; using Microsoft.Web.Preview.Services; //…… [ScriptService] public class EmployeeDataService : DataService { static List "John Smitch","1970 Napa Ct.")); _data.Add(new Employees(1, "Mary Smitch","9833 Mt. Dias Blv.")); _data.Add(new Employees(2, "Mike Jodan","7484 Roundtree Drive")); _data.Add(new Employees(3, "Ronald Adina","9539 Glenside Dr")); _data.Add(new Employees(4, "Blue Yonder Airlines","1226 Shoe St.")); _data.Add(new Employees(5, "Milton Albury","1399 Firestone Drive")); _data.Add(new Employees(6, "Phyllis Allen","5672 Hale Dr.")); _data.Add(new Employees(7, "Stanley Alan","6387 Scenic Avenue")); _data.Add(new Employees(8, "Alexander Berger", "8713 Yosemite Ct.")); _nextId = 9; } } } return _data; } } [WebMethod] [DataObjectMethod(DataObjectMethodType.Delete)] public void DeleteRecords(int id) { foreach (Employees row in _data) { if (row.Id == id) { lock (_dataLock) { _data.Remove(row); } break; } } } [WebMethod] [DataObjectMethod(DataObjectMethodType.Select)] public Employees[] SelectRecords() { return EmployeeDataService.Data.ToArray(); } [WebMethod] [DataObjectMethod(DataObjectMethodType.Insert)] public Employees InsertRecords(string name, string Address) { Employees newRow; lock (_dataLock) { newRow = new Employees(_nextId++, name, Address); _data.Add(newRow); } return newRow; } [WebMethod] [DataObjectMethod(DataObjectMethodType.Update)] public void UpdateRecords(Employees updateRow) { foreach (Employees row in _data) { if (row.Id == updateRow.Id) { row.Name = updateRow.Name; row.Address = updateRow.Address; break; } } } } public class Employees { private int _id; private string _name; private string _address; [DataObjectField(true, true)] public int Id { get { return _id; } set { _id = value; } } [DataObjectField(false)] [DefaultValue("")] public string Name { get { return _name; } set { _name = value; } } [DataObjectField(false)] [DefaultValue("")] public string Address { get { return _address; } set { _address = value; } } public Employees() { _id = -1; } public Employees(int id, string name, string address) { _id = id; _name = name; _address = address; } } |
注意,在这个例子中,为了简化问题,我们使用了一个内存数据源以实现对有状态的WEB服务的模拟,但在实际开发中这一般是不推荐使用的。
接下来,让我们深入探讨那个“神秘”的DataService。




