[翻译]asp.net ajax xml-script教程(三)

原文地址: http://dotnetslackers.com/articles/atlas/xml_script_tutorial_part3.aspx


asp.net ajax xml-script教程(三)


原文发布日期:2007.01.01
作者: Alessandro Gallo
翻译: webabcd


介绍
在xml-script教程的 第一部分(译者注: 中文在这里)和 第二部分(译者注: 中文在这里)中我们介绍了声明程序模型和如何通过客户端的Microsoft Ajax对象处理事件。处理事件可以调用一段javascript函数,也可以使用action。在本文(第三部分)中我们将谈谈InvokeMethod action,它允许我们以声明的方式调用一个方法。


InvokeMethod Action
InvokeMethod action可以调用一个方法,该方法必须是客户端对象已有的一个类型描述符。在接下来的示例中,我们将介绍一个action,它就是Futures CTP下的Sys.Preview.Net.ServiceMethodRequest。这个类抽象出了一个异步调用web service的方法,并且有一个允许在xml-script中使用的类型描述符。也就是说我们可以不用写一行javascript就能调用一个web service上的方法并且得到返回结果。


示例
我们将调用web service上的一个返回当前时间的方法,然后把这个时间显示到一个Label上。

首先我们要先创建一个web service。在你的安装了Ajax-CTP的站点中新建一个名为DateTimeService.asmx的web service,其代码如下:
<% @ WebService Language="C#" Class="DateTimeService"  %>   
using System; 
using System.Web; 
using System.Web.Services; 
using System.Web.Services.Protocols; 
using System.Web.Script.Services;  

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[ScriptService] 
public class DateTimeService : System.Web.Services.WebService 
{      
  [WebMethod]     
  [ScriptMethod]     
  public string GetTimeAsString() 
  {         
    return DateTime.Now.ToShortTimeString();     
  } 

注意:DateTimeService类被ScriptService属性所描述,它通知asp.net ajax去生成一个web service的客户端代理类。这个代理类允许我们使用客户端的javascript来调用以ScriptMethod描述的方法(就是像GetTimeAsString的这种方法)

现在让我们来看看xml-script中的代码,为了使用xml-script这个特性,你需要在你的web站点中引用Microsoft.Web.Preview.dll,然后在ScriptManager内加载PreviewScript.js文件
<% @ Page Language="C#"  %>

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>

< html  xmlns ="http://www.w3.org/1999/xhtml"   >
< head  runat ="server" >
    
< title > Declarative WebService Call </ title >
</ head >
< body >
    
< form  id ="form1"  runat ="server" >
    
< asp:ScriptManager  ID ="ScriptManager1"  runat ="server" >
     
< Services >
        
< asp:ServiceReference  Path ="DateTimeService.asmx"   />
     
</ Services >
     
< scripts >
            
<asp:ScriptReference Assembly="Microsoft.Web.Preview" Name="PreviewScript.js" />
     
</ scripts >
    
</ asp:ScriptManager >
    
    
< h2 >
        
< span > Time on Web Server:  </ span >
        
< asp:Label  ID ="lblTime"  runat ="server" ></ asp:Label >
    
</ h2 >

    
< script  type ="text/xml-script" >
     
<page xmlns="http://schemas.microsoft.com/xml-script/2005">
        
<components>
         
<label id="lblTime" />
         
         
<timer id="theTimer" interval="2000" enabled="true">
             
<tick>
                 
<invokeMethodAction target="timeServiceMethod" method="invoke">
                     
<parameters userContext="" />
                 
</invokeMethodAction>
             
</tick>
         
</timer>
         
         
<serviceMethodRequest id="timeServiceMethod" 
                                 url
="DateTimeService.asmx" 
                                 methodName
="GetTimeAsString">
            
<completed>
                
<setPropertyAction target="lblTime"
                                 property
="text"
                                 
>
                    
<bindings>
                        
<binding dataContext="timeServiceMethod"
                                 dataPath
="result"
                                 property
="value"
                                 
/>        
                    
</bindings>
                
</setPropertyAction>
            
</completed>
         
</serviceMethodRequest>
        
</components>
     
</page>
    
</ script >
    
</ form >
</ body >
</ html >

让我们来看一看其中的xml-script代码块。label元素关联到span标签,Sys.Preview.UI.Label控件的实例在runtime的时候被创建。后面是一个timer元素,使用它的时候会创建一个Sys.Preview.Timer类的实例,timer暴露了一个interval属性用来设置时间的间隔,每过一个间隔时间Timer对象的tick事件将被触发。


关于InvokeMethod Action的更多内容
tick事件可以用来处理一个InvokeMethod action,调用它的方法是invoke(在method属性中指定),调用对象的id是timeServiceMethod,用target属性指出。在invokeMethodAction元素内有一个parameters元素,该元素用于指定传递给方法的参数。如果要指定一个参数,我们要在parameters元素中增加参数名称和参数值。在上面的例子中,我们指定了一个被称作userContext的参数并设置其值为空。

id为timeServiceMethod的serviceMethodRequest元素被解析成一个Sys.Preview.Net.ServiceMethodRequest类的实例。url和methodName属性分别指定web service的路径及调用方法的名称。

在serviceMethodRequest元素内我们会发现一个completed节点。当ServiceMethodRequest类成功的异步调用了web方法后将触发completed事件,我们使用SetProperty action来处理这个事件,以设置label的text为web方法返回的格式化了当前日期的字符串。ServiceMethodRequest类还暴露了其它一些事件,如timeout和error,当异步请求的处理期间发生了过期或错误的时候将会触发它们。


绑定
在setPropertyAction元素内声明一个绑定元素是一件让人感兴趣的事。因为通过web方法返回的字符串是存储在ServiceMethodRequest类的result属性里的,所以我们不能在setPropertyAction的value属性中指定它,而是需要声明式的访问result属性。

要这么做,就需要使用绑定,建立相同对象或不同对象的两个属性之间的关系,可以使得当一个属性发生改变的时候,另一个属性也自动的改变。如果你注意看了示例中的绑定声明,你会看到dataContext属性指向timeServiceMethod,dataPath属性指向result。最后property属性设置成value。setPropertyAction元素的value属性(或者说是SetPropertyAction类的value属性)将总是和ServiceMethodRequest类的result属性有相同的值。作为结果,label的text将通过result属性被设置成返回的字符串。

如果你还不明白绑定是如何工作的,不要着急,因为我们将在这个系列教程的下一部分中解释它们。


总结
在本文(教程的第三部分)中我们介绍了InvokeMethod action,这个action可以调用一个在客户端对象中的类型描述符中暴露的方法。在这个例子中,我们使用了InvokeMethod action和SetProperty action去每隔一段时间调用一次web方法,并在label中显示返回的字符串,所有这些都不用写一行javascript。

在本教程的下一部分中,我们将懂得如何创建自定义的action。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值