深入Atlas系列:Web Sevices Access in Atlas示例(5) - 自定义TypeConverter把基础类型转换为复杂类型
2006-10-19 11:40
761 查看
在上一个示例《深入Atlas系列:Web Sevices Access in Atlas示例(4) - 使用HTTP GET调用Web Services方法》中我们了解到如何通过HTTP GET来访问Web Services方法。很显然,使用HTTP GET依靠Query String传递参数,于是在客户端拿到的总是基本数据类型String。幸好,在Atlas中,对于基础类型的参数,如果遇到了一个字符串,则会设法将其转换成一个合适的类型。因此,在使用HTTP GET方法传递参数时,在Web Services方法里能够使用个中各样的基础类型。
但是,这显然远远不够,Atlas也不会将这个问题置之不理。在Atlas中,自提供了一套自定义机制可以将基础类型转换为复杂类型。在《深入Atlas系列:Web Sevices Access in Atlas示例(2) - 自定义JavaScriptConverter处理循环引用对象》里我们知道了依靠自定义JavaScriptObject类可以为一个或一系列的类提供自定的序列化和反序列化的功能。在现在这片文章中,我将使用示例演示一下如何使用TypeConverter自定义基础类型到复杂类型的转换(请注意,这个方法是提供了基础类型向复杂类型转换的功能,在使用HTTP POST传递Web Services参数时也能使用)。在某些最简单的需求下,就可以使用这个方法,它比自定义一个JavaScriptObject相对要方便一些。
TypeConverter对于编写ASP.NET Server Control的朋友可谓是再熟悉不过了。我们通过示例,一步一步地来查看如何在Atlas中使用自定义TypeConverter。
首先,定义一个复杂类型Employee:
Javascript和HTML代码
1 <html xmlns="http://www.w3.org/1999/xhtml" >
2 <head>
3 <title>Convert Primitive Object using Customized TypeConverter</title>
4 <script language="javascript">
5 function submitEmployee()
6 {
7 var emp = new Object();
8 emp.Name = $("txtName").value;
9 emp.Age = parseInt($("txtAge").value, 10);
10
11 var serializedEmp = Sys.Serialization.JSON.serialize(emp);
12 var url = "HttpGetEmployeeService.asmx?mn=SubmitEmployee&employee=" + encodeURI(serializedEmp);
13 window.open(url);
14 }
15 </script>
16 </head>
17 <body style="font-family:Verdana; font-size:13px;">
18 <form runat="server">
19 <atlas:ScriptManager ID="ScriptManager1" runat="server" />
20
21 <div>Name:<input type="text" id="txtName" /></div>
22 <div>Age:<input type="text" id="txtAge" /></div>
23 <input type="button" value="Submit" onclick="submitEmployee();" />
24 </form>
25 </body>
26 </html>
在奠基“Submit”按钮之后,会调用submitEmployee函数,这个函数根据用户的输入构造一个Employee对象,然后再使用和上一篇文章相同的办法拼接URL,最后使用window.open打开。
我们来看一下使用效果,首先是刚打开窗口:
输入内容并点击Submit,注意新窗口中的地址栏信息:
这个示例就到此为止了,这个就是自定义TypeConverter的使用。
事实上,正如前面我提到的,完全可以不使用JSON方式来传递对象。个人认为,TypeConverter最大的作用是可以隐藏一个复杂类型的细节,例如我们将用户认证信息加密后传输到客户端,然后客户端使用字符串形式传递给一个Web Services方法,然后使用自定义TypeConverter获得解密后的对象,这样就可以安全地传递信息。
不过,有了JavaScriptObject和TypeConverter,我们该如何选择呢?根据我的理解,在选择时,我们可以这样判断:
1、如果需要隐藏复杂类型细节,则使用TypeConverter。
2、如果需要在客户端提供代理,则使用JavaScriptObject。
3、如果需要扩展已有的类,使用JavaScriptObject。
4、如果无法确定用哪种扩展机制,使用自定义JavaScriptObject。
点击这里下载示例源代码。
但是,这显然远远不够,Atlas也不会将这个问题置之不理。在Atlas中,自提供了一套自定义机制可以将基础类型转换为复杂类型。在《深入Atlas系列:Web Sevices Access in Atlas示例(2) - 自定义JavaScriptConverter处理循环引用对象》里我们知道了依靠自定义JavaScriptObject类可以为一个或一系列的类提供自定的序列化和反序列化的功能。在现在这片文章中,我将使用示例演示一下如何使用TypeConverter自定义基础类型到复杂类型的转换(请注意,这个方法是提供了基础类型向复杂类型转换的功能,在使用HTTP POST传递Web Services参数时也能使用)。在某些最简单的需求下,就可以使用这个方法,它比自定义一个JavaScriptObject相对要方便一些。
TypeConverter对于编写ASP.NET Server Control的朋友可谓是再熟悉不过了。我们通过示例,一步一步地来查看如何在Atlas中使用自定义TypeConverter。
首先,定义一个复杂类型Employee:
Javascript和HTML代码
1 <html xmlns="http://www.w3.org/1999/xhtml" >
2 <head>
3 <title>Convert Primitive Object using Customized TypeConverter</title>
4 <script language="javascript">
5 function submitEmployee()
6 {
7 var emp = new Object();
8 emp.Name = $("txtName").value;
9 emp.Age = parseInt($("txtAge").value, 10);
10
11 var serializedEmp = Sys.Serialization.JSON.serialize(emp);
12 var url = "HttpGetEmployeeService.asmx?mn=SubmitEmployee&employee=" + encodeURI(serializedEmp);
13 window.open(url);
14 }
15 </script>
16 </head>
17 <body style="font-family:Verdana; font-size:13px;">
18 <form runat="server">
19 <atlas:ScriptManager ID="ScriptManager1" runat="server" />
20
21 <div>Name:<input type="text" id="txtName" /></div>
22 <div>Age:<input type="text" id="txtAge" /></div>
23 <input type="button" value="Submit" onclick="submitEmployee();" />
24 </form>
25 </body>
26 </html>
在奠基“Submit”按钮之后,会调用submitEmployee函数,这个函数根据用户的输入构造一个Employee对象,然后再使用和上一篇文章相同的办法拼接URL,最后使用window.open打开。
我们来看一下使用效果,首先是刚打开窗口:
输入内容并点击Submit,注意新窗口中的地址栏信息:
这个示例就到此为止了,这个就是自定义TypeConverter的使用。
事实上,正如前面我提到的,完全可以不使用JSON方式来传递对象。个人认为,TypeConverter最大的作用是可以隐藏一个复杂类型的细节,例如我们将用户认证信息加密后传输到客户端,然后客户端使用字符串形式传递给一个Web Services方法,然后使用自定义TypeConverter获得解密后的对象,这样就可以安全地传递信息。
不过,有了JavaScriptObject和TypeConverter,我们该如何选择呢?根据我的理解,在选择时,我们可以这样判断:
1、如果需要隐藏复杂类型细节,则使用TypeConverter。
2、如果需要在客户端提供代理,则使用JavaScriptObject。
3、如果需要扩展已有的类,使用JavaScriptObject。
4、如果无法确定用哪种扩展机制,使用自定义JavaScriptObject。
点击这里下载示例源代码。
相关文章推荐
- 深入Atlas系列:Web Sevices Access in Atlas示例(5) - 自定义TypeConverter把基础类型转换为复杂类型
- 深入Atlas系列:Web Sevices Access in Atlas示例(5) - 自定义TypeConverter把基础类型转换为复杂类型
- struts2自定义类型转换(1)基于DefaultTypeConverter
- struts2自定义类型转换(1)基于DefaultTypeConverter
- Spring.Net -- 如何使用用户自定义类型转换器 (Custom Type Converter )
- 深入Atlas系列:Web Sevices Access in Atlas(4) - 对于复杂数据类型的支持(上)
- struts2自定义类型转换(1)基于DefaultTypeConverter
- 深入Atlas系列:Web Sevices Access in Atlas(4) - 对于复杂数据类型的支持(上)
- 深入Atlas系列:Web Sevices Access in Atlas(4) - 对于复杂数据类型的支持(上)
- struts2自定义类型转换(2)基于StrutsTypeConverter
- 深入Atlas系列:Web Sevices Access in Atlas示例(7) - 编写JavaScriptConverter处理含有循环引用的类型
- struts2自定义类型转换(2)基于StrutsTypeConverter
- 深入Atlas系列:Web Sevices Access in Atlas(5) - 对于复杂数据类型的支持(中)
- 深入Atlas系列:Web Sevices Access in Atlas(6) - 对于复杂数据类型的支持(下)
- 深入Atlas系列:Web Sevices Access in Atlas示例(7) - 编写JavaScriptConverter处理含有循环引用的类型
- struts2自定义类型转换(2)基于StrutsTypeConverter
- 深入Atlas系列:Web Sevices Access in Atlas(5) - 对于复杂数据类型的支持(中)
- 深入Atlas系列:Web Sevices Access in Atlas(6) - 对于复杂数据类型的支持(下)
- 深入Atlas系列:客户端网络访问基础结构示例(1) - 编写并使用自定义的WebRequestExecutor
- 深入Atlas系列:客户端网络访问基础结构示例(1) - 编写并使用自定义的WebRequestExecutor