[翻译]ASP.NET AJAX调用Web Service

初稿地址:http://www.developer.com/net/asp/article.php/3657826
[原稿源码下载]

ASP.NET AJAX调用Web Service

初稿发布日期:2007.02.08
作者:Bipin Joshi
翻译:webabcd

介绍
固然AJAX是种客户端技术,但实质上的支出进程,它平常要调用一个劳动器端的经过。平常,网站上的数额是存放在一个关系型数据库中,为了让AJAX更有用处,处理服务器端数据须要一种简易可靠的点子。幸运的是,ASP.NET
AJAX提供了一种有效的基础架构来做那件工作,浏览器和服务器在Internet上可以展开AJAX通信。顺其自然,Web
Service在数量传输和客户端/服务器之间的一般通讯方面可以扮演一个要害角色。本文就演示了一旦经过ASP.NET
AJAX调用ASP.NET web services。

软件必要
本文所有的范例都是行使ASP.NET AJAX RC版,而且,要在SQL Server 2005
(Express版即可)上有一个诺思wind数据库。范例使用Visual Studio
2005看作支出环境。

范例场景
范例开发了一个Web页面,用于输入诺思wind数据库人士表中的干部数据。页面通过ASP.NET
AJAX功用,调用一个Web Service来形成人士表中的数据增、删、改、查。

创办一个Web Service
用作开始,使用Visual Studio 2005开立一个新的Web站点,注意把ASP.NET
AJAX项目模板添加到新站点对话框,这些对话框包含一个”ASP.NET AJAX Enabled
Web Site” 模板。
图片 1
图1:新站点成立模板

动用”ASP.NET AJAX Enabled Web Site”
模板创立的新站点和用一般方法创立的站点不一致如下:
    ·它的Web.config自动包蕴不少ASP.NET AJAX专用的安顿新闻。
    ·System.Web.Extensions程序集被添加到引用中。

当然,大家可以变更一个家常的Web站点,以使之符合AJAX必要,但模板可以大大简化大家的工作。

现今我们创建了一个新的Web站点,添加一个新的web
service并取名为EmployeeService.asmx,EmployeeService将席卷5个Web方法

Method Name Description
GetEmployees() 返回Employees表里的雇员列表。 这个列表是一个Employee对象数组
GetEmployee() 接收EmployeeID参数返回Employee对象的详细信息
Insert() 给Employees表里增加一个新的雇员信息
Update() 更新Employees表里的某个雇员信息
Delete() 删除Employees表里的某个雇员信息

表1:EmployeeService中的Web方法

GetEmployees() 和
GetEmployee()方法以Employee对象的花样重返数据,因而,首先创立一个Employee类。右键单击App_Code文件夹,拔取“添加新项…”,添加一个叫Employee的类,下边突显Employee类的任何代码:

图片 2public class Employee
图片 3图片 4图片 5{
图片 6   private int intEmployeeID;
图片 7   private string strFirstName;
图片 8   private string strLastName;
图片 9   public int EmployeeID
图片 10图片 11   图片 12{
图片 13      get
图片 14图片 15      图片 16{
图片 17         return intEmployeeID;
图片 18      }
图片 19      set
图片 20图片 21      图片 22{
图片 23         intEmployeeID = value;
图片 24      }
图片 25   }
图片 26   public string FirstName
图片 27图片 28   图片 29{
图片 30      get
图片 31图片 32      图片 33{
图片 34         return strFirstName;
图片 35      }
图片 36      set
图片 37图片 38      图片 39{
图片 40         strFirstName = value;
图片 41      }
图片 42   }
图片 43   public string LastName
图片 44图片 45   图片 46{
图片 47      get
图片 48图片 49      图片 50{
图片 51         return strLastName;
图片 52      }
图片 53      set
图片 54图片 55      图片 56{
图片 57         strLastName = value;
图片 58      }
图片 59   }
图片 60}

Employee类申明三个Private变量来分别存放employee ID, first name和 last
name,多个变量再封装在多个public属性中:EmployeeID,
FirstName和LastName。

开辟 web.config文件,添加<connectionStrings>部分如下:

图片 61<connectionStrings>
图片 62   <add name=”connstr” connectionString=
图片 63        “data source=.\sqlexpress;
图片 64        initial catalog=northwind;
图片 65        integrated security=true”/>
图片 66</connectionStrings>

这一部分存放数据库链接字符串,用于指向Northwind数据库,确保修改SqlServer名称、IP地址以及表达办法以和大家的开发条件相符。

当今,打开EmployeeService.cs添加如下代码:

图片 67private string strConn =   “”;
图片 68public EmployeeService()
图片 69图片 70图片 71{
图片 72   strConn = ConfigurationManager.ConnectionStrings[“connstr”].
图片 73             ConnectionString;
图片 74}

代码应用了ConfigurationManager类来读取配置文件中的数据库链接字符串,并存放在一个类级其他变量strConn中,那么些变量将被上边的具备Web
Method所采纳。

现在,添加GetEmployees() web method:

图片 75[WebMethod]
图片 76public Employee[] GetEmployees()
图片 77图片 78图片 79{
图片 80   SqlConnection cnn = new SqlConnection(strConn);
图片 81   cnn.Open();
图片 82   SqlCommand cmd            = new SqlCommand();
图片 83   cmd.Connection            = cnn;
图片 84   cmd.CommandText           = “select employeeid,firstname,
图片 85                                lastname from employees”;
图片 86   SqlDataReader reader      = cmd.ExecuteReader();
图片 87   List<Employee> list = new List<Employee>();
图片 88   while (reader.Read())
图片 89图片 90   图片 91{
图片 92      Employee emp   = new Employee();
图片 93      emp.EmployeeID = reader.GetInt32(0);
图片 94      emp.FirstName  = reader.GetString(1);
图片 95      emp.LastName   = reader.GetString(2);
图片 96      list.Add(emp);
图片 97   }
图片 98   reader.Close();
图片 99   cnn.Close();
图片 100   return list.ToArray();
图片 101}

代码制造了SqlConnection and SqlCommand
对象,然后实施SELECT查询,以获取Employees表中EmployeeID, FirstName
和LastName字段。结果通过SqlDataReader再次回到。然后,创造一个generic-based
Employee数组,通过While循环,给每个Employee实例的属性赋值。当While循环达成的时候,关闭SqlDataReader

SqlConnection。GetEmployees()方法再次回到的品类是Employee数组。因而,generic
List使用List类中的ToArray()方法来更换成Employee数组。

现行,添加一个GetEmployee() web method如下:

图片 102[WebMethod]
图片 103public Employee GetEmployee(int pEmployeeId)
图片 104图片 105图片 106{
图片 107   SqlConnection cnn = new SqlConnection(strConn);
图片 108   cnn.Open();
图片 109   SqlCommand cmd       = new SqlCommand();
图片 110   cmd.Connection       = cnn;
图片 111   cmd.CommandText      = “select employeeid,firstname,lastname
图片 112                           from employees where employeeid=@id”;
图片 113   SqlParameter id      = new SqlParameter(“@id”, pEmployeeId);
图片 114   cmd.Parameters.Add(id);
图片 115   SqlDataReader reader = cmd.ExecuteReader();
图片 116   Employee emp         = new Employee();
图片 117   while (reader.Read())
图片 118图片 119   图片 120{
图片 121      emp.EmployeeID = reader.GetInt32(0);
图片 122      emp.FirstName  = reader.GetString(1);
图片 123      emp.LastName   = reader.GetString(2);
图片 124   }
图片 125   reader.Close();
图片 126   cnn.Close();
图片 127   return emp;
图片 128}

GetEmployee() web method接受一个employee
ID参数作为输入,代码和后面的百般相似,但这一次只回去一个employee。注意,使用SqlParameter来定义传入的EmployeeID。

近来,再添加Insert()、Update()和 Delete()web methods,其中,Insert() web
method 以要增进的Employee的 first name 和 last name 作为参数,Update()
web method 以要革新的employee ID 以及新的first name 和 last
name作为参数,并执行UPDATE语句, Delete() web method 以要刨除的employee
ID 作为参数,然后实施DELETE 语句

图片 129[WebMethod]
图片 130public int Insert(string pFirstName, string pLastName)
图片 131图片 132图片 133{
图片 134   SqlConnection cnn  = new SqlConnection(strConn);
图片 135   cnn.Open();
图片 136   SqlCommand cmd     = new SqlCommand();
图片 137   cmd.Connection     = cnn;
图片 138   cmd.CommandText    = “insert into employees(firstname,lastname)
图片 139                         values (@fname,@lname)”;
图片 140   SqlParameter fname = new SqlParameter(“@fname”, pFirstName);
图片 141   SqlParameter lname = new SqlParameter(“@lname”, pLastName);
图片 142   cmd.Parameters.Add(fname);
图片 143   cmd.Parameters.Add(lname);
图片 144   int i = cmd.ExecuteNonQuery();
图片 145   cnn.Close();
图片 146   return i;
图片 147}
图片 148[WebMethod]
图片 149public int Update(int pEmployeeId,string pFirstName, string pLastName)
图片 150图片 151图片 152{
图片 153   SqlConnection cnn  = new SqlConnection(strConn);
图片 154   cnn.Open();
图片 155   SqlCommand cmd     = new SqlCommand();
图片 156   cmd.Connection     = cnn;
图片 157   cmd.CommandText    = “update employees set firstname=@fname,
图片 158                         lastname=@lname where employeeid=@id”;
图片 159   SqlParameter fname = new SqlParameter(“@fname”, pFirstName);
图片 160   SqlParameter lname = new SqlParameter(“@lname”, pLastName);
图片 161   SqlParameter id = new SqlParameter(“@id”, pEmployeeId);
图片 162   cmd.Parameters.Add(fname);
图片 163   cmd.Parameters.Add(lname);
图片 164   cmd.Parameters.Add(id);
图片 165   int i = cmd.ExecuteNonQuery();
图片 166   cnn.Close();
图片 167   return i;
图片 168}
图片 169[WebMethod]
图片 170public int Delete(int pEmployeeId)
图片 171图片 172图片 173{
图片 174   SqlConnection cnn = new SqlConnection(strConn);
图片 175   cnn.Open();
图片 176   SqlCommand cmd  = new SqlCommand();
图片 177   cmd.Connection  = cnn;
图片 178   cmd.CommandText = “delete from employees where employeeid=@id”;
图片 179   SqlParameter id = new SqlParameter(“@id”, pEmployeeId);
图片 180   cmd.Parameters.Add(id);
图片 181   int i = cmd.ExecuteNonQuery();
图片 182   cnn.Close();
图片 183   return i;
图片 184}

那就到位了web
service的创办。到目前截至,还尚无做任何和AJAX特性相关的任何工作,现在,时机已经成熟,我们经过上面的代码更改web
service类的概念:

图片 185using System.Web.Script.Services;
图片 186图片 187
图片 188图片 189
图片 190[WebService(Namespace = “http://tempuri.org/")\]
图片 191[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
图片 192[ScriptService]
图片 193public class EmployeeService : System.Web.Services.WebService
图片 194图片 195图片 196{
图片 197   图片 198
图片 199   图片 200

瞩目特地标明的石籀文字,大家导入了System.Web.Script.Services命名空间,那几个命名空间来自System.Web.Extensions程序集,那些命名空间提供了[ScriptService]属性,那将使web
service可以被来自客户端的JavaScript (如ASP.NET AJAX)调用。

好了,大家起始准备从ASP.NET AJAX调用Web Service了!

如何调用Web Service
那部分,大家将开创一个Web页面作为数据输入,通过调用刚刚创制的Web
Service来操作Employees表。作为伊始,大家先添加一个EmployeeServiceClient.aspx页面,打开工具箱,选取View
> Toolbox菜单,在工具箱上,选中AJAX Extensions这样的节点(见图2)
图片 201
图 2: 增加模板后的新站点创造对话框

AJAX Extensions部分显得一个Web页面上装有可以利用的ASP.NET
AJAX组件。所有应用ASP.NET
AJAX的页面都亟待一个ScriptManager组件。打开ScriptManager属性窗口,定位Services属性,打开Service引用编辑器,如图3:
图片 202
图 3: Service 引用编辑器

点击对话框尾部的Add按钮,设置Path属性以指向Web
Service(EmployeeService.asmx)的杜撰路径,上面的符号将会发生在Web页面文件中:

图片 203<asp:ScriptManager ID=”ScriptManager1″ runat=”server” >
图片 204   <Services>
图片 205      <asp:ServiceReference Path=”EmployeeService.asmx” />
图片 206   </Services>
图片 207</asp:ScriptManager>

对每个Web
Service调用,都亟需在<asp:ScriptManager>部分添加一个<asp:ServiceReference>元素,此标志把要运用的web
service注册到近日web form上。
图片 208
图 4: 设计页面表单

表单包含一个下拉框(<SELECT>) ,用于浮现所有的employee
IDs,一旦当选其中一个employee
ID,employee的详细音信将彰显在2个文本框中,然后可以立异这么些音讯。假如要添加一个employee,只必要输入first
name 和 last
name,然后点击“插入”按钮就可以了。同理,如果要刨除一个employee,选用下拉框中的employee
ID,点击“删除”按钮。在INSERT、UPDATE或者
DELETE操作已毕后,将会来得成功或者败北的音信。上边是持有的页面代码:

图片 209<table>
图片 210   <tr>
图片 211      <td colspan=”2″>
图片 212         <asp:Label ID=”Label4″ runat=”server” Font-Size=”X-Large”
图片 213                    Text=”Employee Management”>
图片 214         </asp:Label></td>
图片 215   </tr>
图片 216   <tr>
图片 217      <td style=”width: 100px”>
图片 218         <asp:Label ID=”Label1″ runat=”server”
图片 219                    Text=”Employee ID :”></asp:Label></td>
图片 220      <td style=”width: 100px”>
图片 221         <select id=”Select1″ >
图片 222         </select>
图片 223      </td>
图片 224   </tr>
图片 225   <tr>
图片 226      <td style=”width: 100px”>
图片 227         <asp:Label ID=”Label2″ runat=”server”
图片 228                    Text=”First Name :”></asp:Label></td>
图片 229      <td style=”width: 100px”>
图片 230         <input id=”Text1″ type=”text” /></td>
图片 231   </tr>
图片 232   <tr>
图片 233      <td style=”width: 100px”>
图片 234         <asp:Label ID=”Label3″ runat=”server”
图片 235                    Text=”Last Name :”></asp:Label></td>
图片 236      <td style=”width: 100px”>
图片 237         <input id=”Text2″ type=”text” /></td>
图片 238   </tr>
图片 239   <tr>
图片 240      <td align=”center” colspan=”2″>
图片 241         <input id=”Button3″ type=”button” value=”Insert” />
图片 242         <input id=”Button4″ type=”button” value=”Update” />
图片 243         <input id=”Button5″ type=”button” value=”Delete” />
图片 244      </td>
图片 245   </tr>
图片 246   <tr>
图片 247      <td align=”center” colspan=”2″>
图片 248         <span id=”lblMsg” style=”font-weight: bold;
图片 249               color: red;”></span>
图片 250      </td>
图片 251   </tr>
图片 252</table>

只顾:大家没有使用ASP.NET服务器端控件,如DropDownList、 TextBox 以及
Button。取而代之的是,大家用的传统的HTML控件,如:<SELECT> 以及
<INPUT>。那因为大家要想经过客户端JavaScript调用web
service,而不是由此服务端代码。同理,注意底下的<SPAN>标记,那是用来展现成功依然败北的音信的。

下一步,在<head>元素内增加一个<script>部分,添加一个CallWebMethod()的函数:

图片 253function CallWebMethod(methodType)
图片 254图片 255图片 256{
图片 257   switch(methodType)
图片 258图片 259   图片 260{
图片 261      case “select”:
图片 262         EmployeeService.GetEmployees(FillEmployeeList,ErrorHandler,
图片 263                                      TimeOutHandler);
图片 264         break;
图片 265      case “selectone”:
图片 266         var select=document.getElementById(“Select1”);
图片 267         var empid=select.options[select.selectedIndex].value;
图片 268         EmployeeService.GetEmployee(empid,DisplayEmployeeDetails,
图片 269                                     ErrorHandler,TimeOutHandler);
图片 270         break;
图片 271      case “insert”:
图片 272         var text1=document.getElementById(“Text1”);
图片 273         var text2=document.getElementById(“Text2”);
图片 274         EmployeeService.Insert(text1.value,text2.value,
图片 275                                InsertEmployee,ErrorHandler,
图片 276                                TimeOutHandler);
图片 277         break;
图片 278      case “update”:
图片 279         var select=document.getElementById(“Select1”);
图片 280         var empid=select.options[select.selectedIndex].value;
图片 281         var text1=document.getElementById(“Text1”);
图片 282         var text2=document.getElementById(“Text2”);
图片 283         var emp=new Employee();
图片 284         emp.EmployeeID=empid;
图片 285         emp.FirstName=text1.value;
图片 286         emp.LastName=text2.value;
图片 287         EmployeeService.Update(empid,text1.value,text2.value,
图片 288                                UpdateEmployee,ErrorHandler,
图片 289                                TimeOutHandler);
图片 290         break;
图片 291      case “delete”:
图片 292         var select=document.getElementById(“Select1”);
图片 293         var empid=select.options[select.selectedIndex].value;
图片 294         EmployeeService.Delete(empid,DeleteEmployee,ErrorHandler,
图片 295                                TimeOutHandler);
图片 296         break;
图片 297   }
图片 298}

CallWebMethod() 函数 就是用来调用web service的中心决定函数。
这么些函数接收一个字符串参数用来标识调用的格局,它概括一个switch
语句来判断调用的方法,每个 case 块 调用一个web method。 注意web method
是何许被调用的:ASP.NET AJAX 框架自动成立一个JavaScript
代理类,这些代理类和要调用的web service有一致的称呼。由此,上边代码中
EmployeeService 并不是真的的 类,而是一个JavaScript 代理类。
代理类包蕴原始web service中具备的Web Method。除了原来的web method
所概括的参数外,每个方法还包罗3个附加的参数。

率先个参数是一个JavaScript 函数,用于当web method
成功完毕时调用的。记住:所有客户端和劳务器端的AJAX
通讯都是异步的,由此,这几个函数用来捕获web method
的重临值。第三个参数是用以暴发错误的处境下调用的JavaScript
函数。最后,第多个参数是当调用Web Service爆发超时的场地下调用的JavaScript 函数。

先是种意况,case (“select”),就是简单的调用GetEmployees()
方法;第三种景况,case
(“selectone”),调用GetEmployee()方法,通过传统的JavaScript
代码获取下拉框中的employee
ID;同理,第三、第四、第一个Case依次调用Insert()、 Update()和
Delete()方法。

上边的代码通过5个JavaScript函数落成相应的web method
成功调用:FillEmployeeList(), DisplayEmployeeDetails(),
InsertEmployee(), UpdateEmployee()以及
DeleteEmployee()。每个函数接收一个参数作为web method相应的重返值。

图片 299function FillEmployeeList(result)
图片 300图片 301图片 302{
图片 303   var select=document.getElementById(“Select1”);
图片 304   for(var i=0;i<result.length;i++)
图片 305图片 306   图片 307{
图片 308      var option=new Option(result[i].EmployeeID,
图片 309                            result[i].EmployeeID);
图片 310      select.options.add(option);
图片 311   }
图片 312}
图片 313function DisplayEmployeeDetails(result)
图片 314图片 315图片 316{
图片 317   var text1=document.getElementById(“Text1”);
图片 318   var text2=document.getElementById(“Text2”);
图片 319   text1.innerText=result.FirstName;
图片 320   text2.innerText=result.LastName;
图片 321   var lblMsg=document.getElementById(“lblMsg”);
图片 322   lblMsg.innerText=””;
图片 323}
图片 324function InsertEmployee(result)
图片 325图片 326图片 327{
图片 328   if(result>0)
图片 329图片 330   图片 331{
图片 332      var lblMsg=document.getElementById(“lblMsg”);
图片 333      lblMsg.innerText=”Employee added successfully!”;
图片 334   }
图片 335   else
图片 336图片 337   图片 338{
图片 339      var lblMsg=document.getElementById(“lblMsg”);
图片 340      lblMsg.innerText=”Error occurred while adding new employee!”;
图片 341   }
图片 342}
图片 343function UpdateEmployee(result)
图片 344图片 345图片 346{
图片 347   if(result>0)
图片 348图片 349   图片 350{
图片 351      var lblMsg=document.getElementById(“lblMsg”);
图片 352      lblMsg.innerText=”Employee updated successfully!”;
图片 353   }
图片 354   else
图片 355图片 356   图片 357{
图片 358      var lblMsg=document.getElementById(“lblMsg”);
图片 359      lblMsg.innerText=”Error occurred while updating the employee!”;
图片 360   }
图片 361}
图片 362function DeleteEmployee(result)
图片 363图片 364图片 365{
图片 366   if(result>0)
图片 367图片 368   图片 369{
图片 370      var lblMsg=document.getElementById(“lblMsg”);
图片 371      lblMsg.innerText=”Employee deleted successfully!”;
图片 372   }
图片 373   else
图片 374图片 375   图片 376{
图片 377      var lblMsg=document.getElementById(“lblMsg”);
图片 378      lblMsg.innerText=”Error occurred while deleting employee!”;
图片 379   }
图片 380}

FillEmployeeList()
函数以Employee对象数组作为输入参数,还记得GetEmployees() web method
重回的Employee对象数组吧。然后对那一个数组迭代处理,在每一趟迭代中,一个新的OPTION元素被创设并添加到下拉框中。DisplayEmployeeDetails()函数以一个Employee对象作为输入,这几个Employee对象包蕴了一个Employee的详细音讯,并出示在2个文本框中。InsertEmployee(),
UpdateEmployee()和DeleteEmployee()函数以一个整型的数值标明INSERT,
UPDATE和DELETE操作所影响的记录数,一个大于0的数值标明操作成功,并在<SPAN>标记内浮现一个打响的音讯;否则,显示一个错误音讯。当页面第两次加载时,需求用现有的employee
ID给下拉框赋值,那得经过调用一个特定的名为pageLoad()的函数中落到实处:

图片 381function pageLoad()
图片 382图片 383图片 384{
图片 385   CallWebMethod(“select”);
图片 386}
图片 387

pageLoad()函数在客户端浏览器页面加载时自动调用,最终,错误处理(error
handler)和过期处理(timeout handler)函数如下:

图片 388function ErrorHandler(result)
图片 389图片 390图片 391{
图片 392   var msg=result.get_exceptionType() + “\r\n”;
图片 393   msg += result.get_message() + “\r\n”;
图片 394   msg += result.get_stackTrace();
图片 395   alert(msg);
图片 396}
图片 397function TimeOutHandler(result)
图片 398图片 399图片 400{
图片 401   alert(“Timeout :” + result);
图片 402}

提姆eOutHandler() 函数在其他web method
调用暴发超时的图景下调用。它只是突显了一个Alert给用户。 ErrorHandler()
函数在有不当发生的意况下调用,其输入result
参数提供了3个方式:get_exceptionType()、get_message()以及
get_stackTrace()。那多个主意分别重临至极类型(type of
exception)、详细错误音讯 和储藏室跟踪(stack
trace)。那里ErrorHandler()函数也唯有呈现了一个alert给终端用户。

测试网页
现今,大家曾经完毕了web
service和客户端应用程序。测试一下啊!运行网页,试着扩充、更新、删除一个employee看看,图5突显更新一个employee后的效果:
图片 403
图 5: 更新Employee后的页面效果

要想测试错误处理函数,把起先化数据库链接字符串改成一个空值,然后运行网页看看,这一次,就会显得一个警报(alert),如图6:
图片 404
图 6: 链接字符串错误报警

调用外部Web Services
本条事例中,EmployeeService也是Web站点的一部分。有时候,我们的先后也许须求调用根本就没有布署在我们的域的web
services。 ASP.NET AJAX内部须要依赖XML HTTP
对象,而由于安全原因,是不可以和安插在其余表面站点进行通讯的。这就代表地点所说的技艺对外表的web
services调用无效。不幸的是,ASP.NET
AJAX关于此题材还尚未一贯的解决方案(至少在RC版本)。但是,微软发表了一个仍在CTP阶段的“Bridge”技术,大家得以选择此技术来调用一个安插在该地的包装(Wrapper)的类,然后在那么些类中来调用外部的实际的Web
Service。在当下的RC版本中,我们得以在我们的Web Site中开创一个Wrapper Web
Service,以它来调用最初的Web Service。然后在客户端程序中经过调用Wrapper
Web Service达成通讯。上边显示必要的步子:
1. 在web站点中添加一个web引用,指向外部的Web service;
2. 开立一个地面Web service;
3. 在新创制的Web service中,提供包装的web method,这个情势调用外部的Web
Method;
4. 用本文中所说的章程在客户端应用程序中调用本地新拉长的web Service。

调用ASP.NET Web Services的基础架构
ASP.NET AJAX提供了总体的架构以从客户端JavaScript调用ASP.NET web
services。我们得以轻松地用AJAX把劳动器端数据集成进用户响应的Web页面中。而我辈所急需做的就是仅仅用[ScriptService]特性来标识web
Service。ASP.NET AJAX 框架会为大家的web
service自动生成JavaScript代理,然后经过选取代理来调用web methods。

下载源码
[初稿源码下载]

作者:Bipin Joshi
Email:http://www.dotnetbips.com/contact.aspx
简介:Bipin
Joshi是DotNetBips.com的管理人。他是http://www.binaryintellect.com/的提议者,那些企业提供.NET
framwork的栽培和咨询服务。他在印度法兰克福为开发者提供培训。他也是微软的MVP(ASP.Net)和ASPInsiders的会员。

翻译注:原文中的document.getElementById可以用$get来代表

相关文章