使用ASP.NET AJAX异步调用Web Service和页面中的类方法(5):服务器端和客户端数据类型的自动转换:基本类型和枚举类型
2007-06-11 07:54
1481 查看
本文来自《ASP.NETAJAX程序设计第II卷:客户端MicrosoftAJAXLibrary相关》的第三章《异步调用WebService和页面中的类方法》,请同时参考本章的其他文章。
3.7服务器端和客户端数据类型的自动转换
读到这里,细心的读者可能已经发现了:前面的示例程序中传递给WebService以及从WebService返回的数据的类型均为简单的字符串或是整数。可是在实际开发中,只传递字符串或整数类型的数据显然是不够用的。那么ASP.NETAJAX异步通讯层对于服务器端.NET类型和客户端JavaScript类型之间的映射是否提供了一些辅助功能呢?也就是说,在使用ASP.NETAJAX与服务器端进行异步通讯时,我们能不能直接传递诸如DateTime、DataTable乃至更加复杂的自定义类型呢?
答案自然非常令人兴奋——没有任何问题!ASP.NETAJAX异步通讯层提供了强大的服务器端.NET类型和客户端JavaScript类型之间自动转换能力,我们只要略加配置,甚至根本不需要任何配置,即可在异步通讯的过程中传递包括基本类型、枚举类型、复杂类型、集合(包括泛型集合)类型、数组类型等数据。
若是在某些特殊情况下这类自动转换无法满足实际需求,我们需要更为精确地完全控制某个类型的转换规则,那么也不用担心——借助于在ASP.NETAJAX异步通讯层强大的可扩展性,开发者可以容易地实现自己的转换方案,并“插入”到现有ASP.NETAJAX异步通讯层中。关于自定义服务器端和客户端数据类型的转换规则,将在第III卷中详细介绍。
本节就将通过示例程序介绍ASP.NETAJAX异步通讯层所提供的服务器端.NET类型和客户端JavaScript类型之间的自动转换功能。
3.7.1基本类型
在本节中,基本类型是指数字类型(包括整型、浮点型等)、字符串类型、布尔类型、时间日期类型等。对于这些类型,ASP.NETAJAX异步通讯层能够自动进行服务器端.NET类型和客户端JavaScript类型之间的转换,无须我们任何干预。
例如对于下面的WebService定义,其中定义了一个名为SendSimpleTypes()的方法,分别接受整型、浮点型、字符串类型、布尔类型、时间日期的六个参数。SendSimpleTypes()方法没有什么实际功能,仅仅起到演示的作用:
[code][WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
[/code]
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
然后在客户端我们可以分别创建这5种类型,并尝试通过ASP.NETAJAX异步通讯层生成的代理传递到该WebService中:
[code]varfloatVar=123.456;
[/code]
在VisualStudio中启动调试功能,在前面定义的WebService方法SendSimpleTypes()的第一行加上一个断点(如图3-10所示)。
图3-10在WebService方法的第一行设置断点
当程序运行至SendSimpleTypes()方法时,打开VisualStudio的“Locals”窗口(Ctrl+Alt+V,L)可以看到SendSimpleTypes()方法的5个参数均已被正确地传递到了服务器端。如图3-11所示。
图3-11在“Locals”窗口中查看局部变量的值
3.7.2枚举类型
对于枚举类型,若是某个WebService代理中有所使用(或者WebService方法接受枚举类型,或者WebService方法返回枚举类型)的话,ASP.NETAJAX异步通讯层也将自动为该枚举类型生成客户端JavaScript版本,并负责客户端与服务器端类型之间的转换,同样无须我们任何干预。
例如对于如下WebService以及其中定义的GetTomorrowDay()方法,用来接受一个类型为System.DayOfWeek类型的枚举,然后返回同样类型的枚举,表示下一天是星期几:
[code][WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
[/code]
若是在页面中引入了上面的这个名为EnumService的WebService代理:
[code]<Services>
[/code]
然后在页面中书写如下的客户端脚本:
[code]debugger;
[/code]
在VisualStudio中启动调试后,程序将在ASP.NETAJAX客户端框架初始化完毕时(即执行该pageLoad()方法)停下来(debugger语句)。
参考:关于pageLoad()方法以及ASP.NETAJAX客户端框架的初始化过程,将在第4章中详细介绍。关于debugger语句以及ASP.NETAJAX应用程序的调试方法和技巧,将在第III卷中详细介绍。
这是随便打开一个“Watch”窗口(Ctrl+Alt+W,然后数字键1、2、3或者4均可),在其中输入“System.DayOfWeek”并回车确认。随后点击“System.DayOfWeek”一行左边的加号图标展开其中内容,即可看到ASP.NETAJAX异步通讯层自动为该服务器端枚举类型生成客户端枚举类型中的各个属性。如图3-12所示,注意其中从“Sunday”到“Saturday”的7个枚举值。
图3-12ASP.NETAJAX异步通讯层为
服务器端System.DayOfWeek枚举类型生成的客户端枚举类型
这样,页面中就拥有了服务器端System.DayOfWeek枚举类型的客户端版本。此后,我们也可以将这个客户端的System.DayOfWeek枚举值直接传递给WebService:
服务器端将收到“Monday”,当然这个“Monday”已经是服务器端.NET类型的枚举了,如图3-13所示。
图3-13服务器端收到客户端传递过来的System.DayOfWeek枚举值
随后客户端的回调函数将收到客户端System.DayOfWeek枚举类型的星期二值(“Tuesday”),如图3-14所示。
图3-14客户端回调函数收到服务器返回的System.DayOfWeek枚举值
对于我们自定义的.NET枚举类型,ASP.NETAJAX异步通讯层同样将一视同仁地生成客户端版本。例如如下表示太阳系八大行星的枚举类型:
[code]{
[/code]
若是在WebService方法中用到了的话,例如如下所示的一个WebService方法,用来随机返回八大行星中的一个:
[code]publicPlanetsGetRandomPlanet()
[/code]
ASP.NETAJAX异步通讯层将为其生成相应的客户端代理。如图3-15所示(同样是在VisualStudio的“Watch”窗口中)。
图3-15ASP.NETAJAX异步通讯层为服务器端自定义枚举类型生成的客户端枚举类型
总结:想要让ASP.NETAJAX异步通讯层为服务器端枚举类型自动生成相应的客户端枚举类型,并在调用过程中传递并接收该枚举,我们需要:
为WebService类或WebService中需要暴露给客户端的方法添加[ScriptService]属性;
为WebService中需要暴露给客户端的方法添加[WebMethod]属性;
WebService类中的某个方法的某个参数或返回值为该枚举类型;
在页面中的ScriptManager控件中添加对该WebService的引用;
在客户端用如下JavaScript语法使用该枚举类型:
[NameSpace].[EnumName].[EnumKey]
3.7服务器端和客户端数据类型的自动转换
读到这里,细心的读者可能已经发现了:前面的示例程序中传递给WebService以及从WebService返回的数据的类型均为简单的字符串或是整数。可是在实际开发中,只传递字符串或整数类型的数据显然是不够用的。那么ASP.NETAJAX异步通讯层对于服务器端.NET类型和客户端JavaScript类型之间的映射是否提供了一些辅助功能呢?也就是说,在使用ASP.NETAJAX与服务器端进行异步通讯时,我们能不能直接传递诸如DateTime、DataTable乃至更加复杂的自定义类型呢?
答案自然非常令人兴奋——没有任何问题!ASP.NETAJAX异步通讯层提供了强大的服务器端.NET类型和客户端JavaScript类型之间自动转换能力,我们只要略加配置,甚至根本不需要任何配置,即可在异步通讯的过程中传递包括基本类型、枚举类型、复杂类型、集合(包括泛型集合)类型、数组类型等数据。
若是在某些特殊情况下这类自动转换无法满足实际需求,我们需要更为精确地完全控制某个类型的转换规则,那么也不用担心——借助于在ASP.NETAJAX异步通讯层强大的可扩展性,开发者可以容易地实现自己的转换方案,并“插入”到现有ASP.NETAJAX异步通讯层中。关于自定义服务器端和客户端数据类型的转换规则,将在第III卷中详细介绍。
本节就将通过示例程序介绍ASP.NETAJAX异步通讯层所提供的服务器端.NET类型和客户端JavaScript类型之间的自动转换功能。
3.7.1基本类型
在本节中,基本类型是指数字类型(包括整型、浮点型等)、字符串类型、布尔类型、时间日期类型等。对于这些类型,ASP.NETAJAX异步通讯层能够自动进行服务器端.NET类型和客户端JavaScript类型之间的转换,无须我们任何干预。
例如对于下面的WebService定义,其中定义了一个名为SendSimpleTypes()的方法,分别接受整型、浮点型、字符串类型、布尔类型、时间日期的六个参数。SendSimpleTypes()方法没有什么实际功能,仅仅起到演示的作用:
[WebService(Namespace="http://tempuri.org/")]
[code][WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
[ScriptService]
publicclassSimpleTypes:System.Web.Services.WebService
{
[WebMethod]
publicvoidSendSimpleTypes(intintVar,floatfloatVar,
stringstringVar,boolboolVar,DateTimedatetimeVar)
{
//justfortesting
}
}
[/code]
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
然后在客户端我们可以分别创建这5种类型,并尝试通过ASP.NETAJAX异步通讯层生成的代理传递到该WebService中:
varintVar=123;
[code]varfloatVar=123.456;
varstringVar="hello,thisisDflying";
varboolVar=true;
vardatetimeVar=newDate();
SimpleTypes.SendSimpleTypes(
intVar,floatVar,stringVar,boolVar,datetimeVar
);
[/code]
在VisualStudio中启动调试功能,在前面定义的WebService方法SendSimpleTypes()的第一行加上一个断点(如图3-10所示)。
图3-10在WebService方法的第一行设置断点
当程序运行至SendSimpleTypes()方法时,打开VisualStudio的“Locals”窗口(Ctrl+Alt+V,L)可以看到SendSimpleTypes()方法的5个参数均已被正确地传递到了服务器端。如图3-11所示。
图3-11在“Locals”窗口中查看局部变量的值
3.7.2枚举类型
对于枚举类型,若是某个WebService代理中有所使用(或者WebService方法接受枚举类型,或者WebService方法返回枚举类型)的话,ASP.NETAJAX异步通讯层也将自动为该枚举类型生成客户端JavaScript版本,并负责客户端与服务器端类型之间的转换,同样无须我们任何干预。
例如对于如下WebService以及其中定义的GetTomorrowDay()方法,用来接受一个类型为System.DayOfWeek类型的枚举,然后返回同样类型的枚举,表示下一天是星期几:
[WebService(Namespace="http://tempuri.org/")]
[code][WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
[ScriptService]
publicclassEnumService:System.Web.Services.WebService
{
[WebMethod]
publicDayOfWeekGetTomorrowDay(DayOfWeektoday)
{
return(DayOfWeek)(((int)today+1)%7);
}
}
[/code]
若是在页面中引入了上面的这个名为EnumService的WebService代理:
<asp:ScriptManagerID="sm"runat="server">
[code]<Services>
<asp:ServiceReferencePath="Services/EnumService.asmx"/>
</Services>
</asp:ScriptManager>
[/code]
然后在页面中书写如下的客户端脚本:
functionpageLoad(){
[code]debugger;
}
[/code]
在VisualStudio中启动调试后,程序将在ASP.NETAJAX客户端框架初始化完毕时(即执行该pageLoad()方法)停下来(debugger语句)。
参考:关于pageLoad()方法以及ASP.NETAJAX客户端框架的初始化过程,将在第4章中详细介绍。关于debugger语句以及ASP.NETAJAX应用程序的调试方法和技巧,将在第III卷中详细介绍。
这是随便打开一个“Watch”窗口(Ctrl+Alt+W,然后数字键1、2、3或者4均可),在其中输入“System.DayOfWeek”并回车确认。随后点击“System.DayOfWeek”一行左边的加号图标展开其中内容,即可看到ASP.NETAJAX异步通讯层自动为该服务器端枚举类型生成客户端枚举类型中的各个属性。如图3-12所示,注意其中从“Sunday”到“Saturday”的7个枚举值。
图3-12ASP.NETAJAX异步通讯层为
服务器端System.DayOfWeek枚举类型生成的客户端枚举类型
这样,页面中就拥有了服务器端System.DayOfWeek枚举类型的客户端版本。此后,我们也可以将这个客户端的System.DayOfWeek枚举值直接传递给WebService:
EnumService.GetTomorrowDay(System.DayOfWeek.Monday,onSucceeded);
服务器端将收到“Monday”,当然这个“Monday”已经是服务器端.NET类型的枚举了,如图3-13所示。
图3-13服务器端收到客户端传递过来的System.DayOfWeek枚举值
随后客户端的回调函数将收到客户端System.DayOfWeek枚举类型的星期二值(“Tuesday”),如图3-14所示。
图3-14客户端回调函数收到服务器返回的System.DayOfWeek枚举值
对于我们自定义的.NET枚举类型,ASP.NETAJAX异步通讯层同样将一视同仁地生成客户端版本。例如如下表示太阳系八大行星的枚举类型:
namespaceDflying.MyEnums
[code]{
publicenumPlanets
{
Mercury,
Venus,
Earth,
Mars,
Jupiter,
Saturn,
Uranus,
Neptune
}
}
[/code]
若是在WebService方法中用到了的话,例如如下所示的一个WebService方法,用来随机返回八大行星中的一个:
[WebMethod]
[code]publicPlanetsGetRandomPlanet()
{
Randomr=newRandom();
return(Planets)((int)r.Next(9));
}
[/code]
ASP.NETAJAX异步通讯层将为其生成相应的客户端代理。如图3-15所示(同样是在VisualStudio的“Watch”窗口中)。
图3-15ASP.NETAJAX异步通讯层为服务器端自定义枚举类型生成的客户端枚举类型
总结:想要让ASP.NETAJAX异步通讯层为服务器端枚举类型自动生成相应的客户端枚举类型,并在调用过程中传递并接收该枚举,我们需要:
为WebService类或WebService中需要暴露给客户端的方法添加[ScriptService]属性;
为WebService中需要暴露给客户端的方法添加[WebMethod]属性;
WebService类中的某个方法的某个参数或返回值为该枚举类型;
在页面中的ScriptManager控件中添加对该WebService的引用;
在客户端用如下JavaScript语法使用该枚举类型:
[NameSpace].[EnumName].[EnumKey]
相关文章推荐
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(6):服务器端和客户端数据类型的自动转换:复杂类型
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(7):服务器端和客户端数据类型的自动转换:泛型集合类型
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(9):服务器端和客户端数据类型的自动转换:DataTable和DataSet
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(9):服务器端和客户端数据类型的自动转换:DataTable和DataSet
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(8):服务器端和客户端数据类型的自动转换:数组类型
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(6):服务器端和客户端数据类型的自动转换:复杂类型
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(10):服务器端和客户端数据类型的自动转换:以XML方式序列化数据、小结
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(9):服务器端和客户端数据类型的自动转换:DataTable和DataSet
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(6):服务器端和客户端数据类型的自动转换:复杂类型
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(10):服务器端和客户端数据类型的自动转换:以XML方式序列化数据、小结
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法:服务器端和客户端数据类型的自动转换:复杂类型
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(7):服务器端和客户端数据类型的自动转换:泛型集合类型
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(4):异步通讯层生成的客户端代理类、使用HTTP GET进行调用
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(4):异步通讯层生成的客户端代理类、使用HTTP GET进行调用
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(1):调用Web Service、调用页面中的类方法
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(0):目录
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(1):调用Web Service、调用页面中的类方法(转)
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(1):调用Web Service、调用页面中的类方法
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(2):处理异步调用中的异常
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(1):调用Web Service、调用页面中的类方法