原文位址: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。