天天看點

[翻譯]asp.net ajax xml-script教程(二)

原文位址:http://dotnetslackers.com/articles/atlas/xml_script_tutorial_part2.aspx 

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

原文釋出日期:2006.12.11

作者:Alessandro Gallo

翻譯:webabcd

概述

在xml-script教程的第一部分(譯者注:中文在這裡)裡我們介紹了類型描述符并且知道了如何看懂它們。在本文(第二部分)中我們将了解如何在聲明代碼裡通過用戶端控件處理事件。

處理事件

在教程的第一部分讨論類型描述符的時候,我們使用xml-script執行個體化有類型描述符的用戶端元件。有了類的類型描述符,我們就知道如何使用xml-script建立一個執行個體。例如,Sys.Preview.UI.Button和Sys.Preview.UI.Label類包含在PreviewScript.js檔案下,其暴露出的類型描述符如下:

Sys.Preview.UI.Button.descriptor = {

    properties: [ { name: 'command', type: String },

                                { name: 'argument', type: String } ],

    events: [ { name: 'click' } ]

}

Sys.Preview.UI.Label.descriptor = {

    properties: [ { name: 'htmlEncode', type: Boolean },

                                { name: 'text', type: String } ]

}

在接下來的示例代碼中包含了上述的所有描述符。這段代碼是一段标準的xml-script代碼塊。建立了一個Button和一個Label執行個體,Button的click事件調用一段javascript函數,該函數用于在Label上顯示一條資訊。

<%@ Page %>

<!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 id="Head1" runat="server">

    <title>Hello XML-script</title>

</head>

<body>

<form id="form1" runat="server">

        <asp:ScriptManager ID="TheScriptManager" runat="server">

            <Scripts>

                <asp:ScriptReference Assembly="Microsoft.Web.Preview"

                    Name="Microsoft.Web.Resources.ScriptLibrary.PreviewScript.js" />

            </Scripts>

        </asp:ScriptManager>

        <div>

            <input type="button" id="btnSay" value="Click Me" />

        </div>

            <h1><span id="lblHello"></span></h1>

        <script type="text/xml-script">

            <page xmlns="http://schemas.microsoft.com/xml-script/2005">

                <components>

                    <label id="lblHello" />

                    <button id="btnSay" click="btnSay_click" />

                </components>

            </page>

        </script>

        <script type="text/javascript">

        <!--

        function btnSay_click(evt) {

            $find('lblHello').set_text('Hello XML-script!');

        }

        //-->

</form>

</body>

</html>

我們主要來看看頁中xml-script代碼,和在components節點下的一些元素。第一個是Label标簽,它把一個用戶端類型映射到了Sys.Preview.UI.Label執行個體,雙方的映射是通過id屬性來相關聯的。第二個标簽是button,通過id屬性把相關聯的用戶端類型映射到了Sys.Preview.UI.Button執行個體。

button的click屬性是我們感興趣的部分,它的值是一個全局javascript函數的名字 - btnSay_click,該javascript函數寫在後面的javascript代碼塊裡。類型描述符中的一個事件被映射到了xml屬性中的同名事件,這個屬性的值就是用來處理該事件的javascript函數的名稱。

讓我們來看看第二種觸發事件的方法 - 通過用戶端控件。用下面這段代碼取代上面的button标簽。

<button id="btnSay">

    <click>

        <setPropertyAction target="lblHello" property="text"    

            value="Hello XML-script!" />

    </click>

</button>

現在運作這個頁,它将做如代碼改變之前一樣的工作,這是怎麼回事呢?

Actions

類型描述符中的事件可以用與事件名相同的名字作為xml标簽而被解析。它包括一個或多個子元素用來調用action。

一個action就是一個内置了一個事件的執行邏輯的對象。在最後的那個例子中我們用一個被稱作SetProperty的action來處理click事件。這個action實際上就是Sys.Preview.SetPropertyAction類的執行個體,它也有自己的一些類型描述符

Sys.Preview.SetPropertyAction.descriptor = {

    properties: [ {name: 'property', type: String},

                                {name: 'propertyKey' },

                                {name: 'value', type: String} ]

你可以比較一下SetPropertyAction類和其相關的xml标簽,事實上類的名字就映射到了相關的xml元素。xml中的target屬性的值就是Lable控件的id,該Label控件的text屬性将被更改。value屬性的值就是設定Lable控件的text屬性的值。

SetPropertyAction還有一個被稱作propertyKey的類型描述符。它的作用是設定一些屬性的子屬性,下面就是一段示例代碼,你可以用它替換掉原來的相關代碼

        <setPropertyAction target="lblHello"

            property="text"

            property="element"

            propertyKey="style.backgroundColor"

            value="#FFFF00" />

這樣,我們就有兩個action了。第一個action用于設定Lable的text屬性,第二個action使用者把Label的背景顔色設為×××。第二個action的property屬性設定成了“element”,它傳回一個關聯到Label的DOM(span标簽)。我們通過get_的方式來取得屬性,propertyKey屬性包含了擴充屬性,如果我們要通路style對象的backgroundColor屬性的話,應該使用像下面這樣的javascript語句

$find('lblHello').get_element().style.backgroundColor = '#FFFF00';

總結

xml-script允許通過聲明代碼執行個體化有類型描述符的用戶端元件。它允許調用一段javascript函數,或者執行一個或多個action去處理事件。

在下一篇教程裡,我們将繼續讨論事件,并且介紹一下Microsoft Ajax Library裡的其它一些内置action。

繼續閱讀