以组件的思想重新审视Ajax客户端开发
在进入主题之前,我想和大家一起再来看一下本文章系列第一篇中的一个Demo:ASPNETAJAXTest。我现在将其中的客户端代码重新贴在这里。
Default.aspx:
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Untitled Pagetitle> head> <body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server"> <Scripts> <asp:ScriptReference Path="~/ajax.js" /> Scripts> <Services> <asp:ServiceReference Path="~/SayHelloService.asmx" /> Services> asp:ScriptManager> <div> <input id="btnSayHello" type="button" value="SayHello" onclick="btnSayHello_onClick()" /> <div id="result">div> div> form> body> html>
ajax.js:
//
单击btnSayHello时调用的JS函数
function
btnSayHello_onClick()
{
SayHelloService.SayHello(OnSucceeded,OnFailded);
}
//
成功时的回调函数
function
OnSucceeded(reusltText)
{
$get(
"
result
"
).innerHTML
=
reusltText;
}
//
失败时的回掉函数
function
OnFailded(error)
{
$get(
"
result
"
).innerHTML
=
"
调用失败。错误信息:
"
+
error.get_message();
}
这是一种我们很熟悉的JavaScript编程模式:以DOM操作为基础。在这种编程模式下,所有页面元素被看成一个树状的DOM元素集合,不论是取得数据还是改变页面元素的属性,都要使用相应的DOM操作。例如我们要取得某个文本框中的值,则首先使用document.getElementById(在ASP.NET AJAX框架里可以缩写为$get)方法取得这个文本框的DOM引用,然后获取其value属性的值。
这种编程模式,很容易给我们造成困惑,例如文本框、复选框、提交按钮、普通按钮的DOM表示都是“input”元素,另外还要使用如innerHTML这样不是很直观的名字设置div或span的值。其实对于开发人员,尤其是长期从事服务器端开发的人员来说,我们更希望将文本框看做TextBox,将复选框看做CheckBox,将按钮看做Button,将div或span看做Label,而且,我们更希望使用label1.text这样的语句设置div中的文本,而不是使用innerHTML。
幸运的事,ASP.NET AJAX的开发人员显然考虑到了这一点,现在ASP.NET AJAX框架允许我们使用类似服务器端那种组件式的编程模式来进行客户端编程。
下面我们来看一下使用组件思想重新编写的这个应用。首先看一下aspx页面:
Default.aspx:
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Untitled Pagetitle> head> <body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server"> <Scripts> <asp:ScriptReference Assembly="Microsoft.Web.Preview" Name="PreviewScript.js" /> <asp:ScriptReference Path="~/ajax.js" /> Scripts> <Services> <asp:ServiceReference Path="~/SayHelloService.asmx" /> Services> asp:ScriptManager> <div> <input id="btnSayHello" type="button" value="SayHello" /> <div id="result">div> div> form>24body>25html>
这里有两处变化,一是在ScriptManager控件里增加了对PreviewScript.js的引用。这里要注意,客户端组件的内容并不包含在ASP.NET AJAX1.0正式版里,而是包换在ASP.NET AJAX Futures CTP部分。所以,要使用这些功能,首先要添加对Microsoft.Web.Preview.dll文件的引用,