原文发布日期:2006.12.01
作者:Alessandro Gallo
翻译:webabcd
概述
asp.net ajaxt提供了一种通过使用声明程序模型来实例化客户端类型的方法。下面的代码给出了一个最简单的例子,用来在页面加载完毕后显示一段信息。
<!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>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>
<script type="text/xml-script">
<page xmlns="http://schemas.microsoft.com/xml-script/2005">
<components>
<application load="page_load" />
</components>
</page>
</script>
<script type="text/javascript">
<!--
function page_load(sender, e)
{
alert("Hello World!");
}
//-->
</script>
</form>
</body>
</html>
声明代码总是要内嵌到一个脚本标记下,这个脚本标记的type属性为text/xml-script。这段声明代码并不难理解。我们这里有一个封装了components元素的page根元素,它是一般xml-script的标准写法。
在components元素下有一个application节点,设置其load属性的值为一段javascript代码的函数名称。这个load属性被解析成一个事件名称,它的值指向一个客户端函数,该客户端函数将被增加到一个事件处理列表中。因为application元素被映射到了Sys.Application实例,所以当Sys.Application触发了它的load事件的时候,page_load()将被调用。
这是如何实现的呢?声明代码是以xml元素和方法之间的映射为基础的,属性和事件是通过asp.net ajax类来被使用的。这种映射在每一个有类型描述符的类中都存在,而每一个有类型描述符的类都可以在声明代码中被使用。
类型描述符
类型描述符是一个对象,它用来描述类的属性,方法和时间。每个想要提供类型描述符的类都必须实现ITypeDescriptorProvider接口,该接口定义了一个被称做getDescriptor()的方法。这个方法必须返回一个关联到类的类型描述符。ITypeDescriptorProvider接口的原型如下:
getDescriptor: Sys$Preview$ITypeDescriptorProvider$getDescriptor
}
properties: [ { name: 'command', type: String },
{ name: 'argument', type: String } ],
events: [ { name: 'click' } ]
}
·properties:一个属性描述符的数组
·events:一个事件描述符的数组
·methods:一个方法描述符的数组
每一个数组都包含着一组描述符,此时这些描述符的作用是用来描述一个详细的属性、事件或方法的。例如,让我们看一下事件数组中包含的描述符。
{ name: 'argument', type: String }
类型描述符能够反映出客户端类型,它从xml-script中被独立出来。但是,xml-script解析器会在声明代码里把属性、方法和事件映射到xml元素中。
通过查看这个类型描述符,我们即使不了解xml-script是如何工作的,也可以写一段创建类型实体所需的声明代码。用Button类的类型描述符比较一下下面的这段xml
在上面这段xml里,类的名字(Sys.Preview.UI.Button)被映射到了元素的名字(button),属性都是一一对应的,而且事件也被映射成了属性,这个事件属性的值被设置成一个javascript函数名,由这个函数来负责处理click事件。
它的id属性是从哪来的呢?Button类继承自Sys.Component,它id属性也是继承自这个类。如果你在PreviewScript.js文件中搜索Sys.Component的类型描述符,你就会发现有一个id属性的类型描述符。
properties: [ {name: 'dataContext', type: Object},
{name: 'id', type: String},
{name: 'isInitialized', type: Boolean, readOnly: true},
{name: 'isUpdating', type: Boolean, readOnly: true} ],
events: [ {name: 'propertyChanged'} ]
}
结论
在这篇教程里,我们看到了在asp.net页中包含声明代码的基础示例。然后我们介绍了类型描述符,并且知道如何看懂它们。类型描述符为客户端类型提供了了反射,它们在声明程序模型中被使用,这种声明程序模型允许使用xml语法来实例化客户端类型。
在下一篇教程里我们继续学习类型描述符和xml元素之间的映射。