天天看點

[翻譯]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。

上一篇: history
下一篇: history

繼續閱讀