




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JSON JavaScript 和 NET 中的作者:Justin发表于2010-07-30 23:00原文链接阅读:5评论:0原文地址:Aziz,Scott Mitchell 2007年2月适用于:JSON Ajax摘要:本文JavaScript Object Notation(或JSON),即一种开放式和基于文本的数据交换格式,它提供了一种标准数据交换格式,更适用于Ajax样式的Web应用程序。(打印共22页)目录简介了解JavaScript中的文字表示法比较JSON与XML使用JavaScript创建和分析JSON消息在.NET Framework中使用JSON结论参考资料下载本文中所用的源代码。简介在设计要与远程计算机进行通信的应用程序时,必须选择一种数据格式和交换协议。有多种开放式标准方案可供选择,而最理想的选择取决于应用程序需求和已有的功能。例如,基于SOAP的web服务格式化数据的方式是将XML负载封装到SOAP信封中。XML对于许多应用场合非常好用,但在另外一些情况下则存在缺陷,使用不太理想。XML通常使用效果不太理想的领域之一是Ajax风格的web应用程序。Ajax是用于构建交互式web应用程序的技术,此类应用程序通过使用对web服务器的带外轻型调用来代替整页回发,从而提供了更为迅捷的用户体验。这些异步调用通过JavaScript在客户端进行初始化,涉及设置数据格式、将其发送到web服务器,以及分析和处理返回的数据。大多数浏览器可以构建、发送和分析XML,而JavaScript Object Notation(或JSON)提供了一种适用于Ajax风格的web应用程序的标准数据交换格式。JSON是一种基于文本的开放式数据交换格式(请参见RFC 4627)。与XML一样,它便于读者阅读、独立于平台,并且具有广泛的可实现性。根据JSON标准设置格式的数据是轻型的,可由JavaScript实现轻而易举地进行分析,使之成为适用于Ajax web应用程序的理想数据交换格式。JSON主要是一种数据格式,因此它不局限于Ajax web应用程序,在任何场合,只要应用程序需要将结构化信息作为文本进行交换或存储,即可使用它。本文探讨了JSON标准及其与JavaScript的关系,并将其与XML进行比较。文中讨论了用于.NET的开源JSON实现Jayrock,并提供了许多使用JavaScript和C#创建和分析JSON消息的示例。了解JavaScript中的文字表示法在编程语言中,文字用于从字面上表达固定值,如常量整数值4或字符串Hello,World。文字可用在大多数允许使用表达式的语言中,如控制语句的部分条件、调用函数时的输入参数、变量赋值等等。例如,以下C#和Visual Basic代码使用常量整数值42来初始化变量 x=42;/C#Dim xAs Integer=42Visual Basic不同的编程语言允许使用不同类型的文字。大多数编程语言至少都支持标量类型的文字,如整数、浮点数、字符串和布尔值。对于JavaScript来说,有意思的一点是,除了标量类型之外,它还支持结构化类型的文字,如数组和对象。此功能允许在按需要创建和初始化数组及对象时使用简洁的语法。JavaScript中的数组文字由零个或多个表达式组成,每个表达式代表数组的一个元素。数组元素括在方括号内(),并以逗号分隔。以下示例使用具有七大洲名称的七个字符串元素来从字面上定义数组:var continents=Europe,Asia,Australia,Antarctica,North America,South America,Africa;alert(continents0+is one of the+continents.length+continents.);设想在没有文字表示法的JavaScript中创建和初始化数组的情形,将此与之比较:var continents=new Array();continents0=Europe;continents1=Asia;continents2=Australia;continents3=Antarctica;continents4=North America;continents5=South America;continents6=Africa;对象文字定义对象成员及成员值。对象成员及其值的列表包含在大括号()内,成员之间以逗号分隔。在每个成员内,名称和值以冒号(:)分隔。以下示例创建了一个对象,并使用名为Address、City和PostalCode的三个成员来进行初始化,这些成员的值分别为123 Anywhere St.、Springfield和99999。var mailingAddress=Address:123 Anywhere St.,City:Springfield,PostalCode:99999;alert(The package will be shipped to postal code+mailingAddress.PostalCode);到目前为止的这些示例说明了如何在数组和对象文字中使用字符串和数值文字。您还可以通过递归使用表示法来表示整个图表,即数组元素和对象成员值本身可以随之使用对象和数组文字。例如,以下代码段说明了一个以数组为成员的对象(PhoneNumbers),其中该数组由一组对象组成。var contact=Name:John Doe,PermissionToCall:true,PhoneNumbers:Location:Home,Number:555-555-1234,Location:Work,Number:555-555-9999 Ext.123;if(contact.PermissionToCall)alert(Call+contact.Name+at+contact.PhoneNumbers0.Number);注意在核心JavaScript 1.5指南中的文字部分可找到对JavaScript文字支持的进一步讨论。从JavaScript文字到JSON JSON是依据JavaScript中文字对象表示法的子集所创建的数据交换格式。虽然JavaScript可接受的文字值语法非常灵活,不过必须注意,JSON的规则要严格得多。例如,根据JSON标准,对象成员的名称必须为有效的JSON字符串。JSON中的字符串必须用引号括起来。而JavaScript则允许对象成员以引号或撇号分隔,或者完全省略引号(只要成员名称与保留的JavaScript关键字不冲突)。同样,JSON中的数组元素或对象成员值仅限于一个非常有限的集合。然而,在JavaScript中,数组元素和对象成员值几乎可以指一切有效的JavaScript表达式,包括函数调用和定义!JSON的优点在于它的简单性。根据JSON标准设置格式的消息由单个顶层对象或数组组成。数组元素和对象值可以是对象、数组、字符串、数字、布尔值(true和false)或null。简言之,这就是JSON标准!就是如此简单。有关该标准更正式的说明,请参见或RFC 4627。JSON的弱点之一是缺少日期/时间文字。许多人首次接触JSON后,对此都感到惊讶和失望。缺少日期/时间文字的简单解释(无论能否令人安慰)是JavaScript也从未具备此能力:在JavaScript中对时间和日期值的支持完全由Date对象提供。因此,将JSON用作数据格式的大多数应用程序通常会使用字符串或数字来表示日期和时间值。如果使用的是字符串,您通常希望它是ISO 8601格式。如果使用是数字,该值通常表示从epoch开始、以通用协调时间(UTC)表示的毫秒数,其中epoch定义为1970年1月1日午夜(UTC)。同样,这仅仅是个惯例,而不是JSON标准的一部分。如果您要与其他应用程序交换数据,则需要检查其文档,查看它对JSON文字内的日期和时间值是如何进行编码的。例如,Microsoft的ASP.NET AJAX使用的就不是上述任一种惯例。它代之以将.NET DateTime值编码为JSON字符串,字符串内容是/Date(ticks)/,其中ticks表示从epoch(UTC)开始的毫秒数。因此,UTC时间1989年11月29日4:55:30 AM将编码为/Date(628318530718)/。ASP.NET AJAX:在JSON日期和时间字符串内ASP.NEXT中的AJAX JSON序列化程序将DateTime实例编码为JSON字符串。在预发布周期中,ASP.NET AJAX使用格式ticks,其中ticks表示从通用协调时间(UTC)1970年1月1日起经过的毫秒数。以UTC表示的日期和时间(如1989年11月29日4:55:30 AM)会编码为62831853071。虽然简单易懂,但此格式无法区分序列化的日期和时间值与看起来像序列化日期但又不需要进行反序列化的值。因此,ASP.NET AJAX团队对最终版本进行了更改,通过采用/Date(ticks)/格式解决了这一问题。新格式借助一个小技巧减少了误解的可能性。在JSON中,字符串中的正斜杠(/)字符可以用反斜杠()进行转义(即使没有对此进行严格要求)。ASP.NET AJAX团队利用这点修改了JavaScriptSerializer,将DateTime实例编写为字符串/Date(ticks)/。两个正斜杠的转义只是表面的,但对JavaScriptSerializer至关重要。按照JSON规则,/Date(ticks)/在技术上相当于/Date(ticks)/,但JavaScriptSerializer会将前者反序列化为DateTime,将后者反序列化为String。因此与预发布版本的ticks格式相比,混淆的可能性会大大减少。比较JSON与XML JSON和XML均能够以基于文本、便于读者阅读的数据交换格式来表示本机内存中对象。此外,两种数据交换格式是同构的,只要文本是一种格式,即可得出另外一种格式的等效文本。例如,调用可公开访问的Yahoo!web服务之一时,您可以通过querystring参数指明响应需要设置为XML还是JSON格式。因此,决定数据交换格式时,不是简单的选此或彼作为银弹的问题,而是要看哪种格式具有成为特定应用程序的最佳选择的特征。例如,XML起源于标记文档文本,而且有继续在该领域发扬光大的趋势(XHTML就是很好的证明)。而JSON则起源于编程语言类型和结构,因此提供了更加自然和便于使用的交换结构化数据映射。除了这两个起点之外,下表可帮助您了解和比较XML与JSON的重要特征。XML与JSON之间的重要特征区别特征XMLJSON数据类型不提供任何数据类型概念。必须依靠XML架构来添加类型信息。提供标量数据类型,并能够通过数组和对象表示结构化数据。数组支持必须按照惯例表示数组,例如通过使用外部占位符元素,将数组内容模型化为内部元素。通常,外部元素使用内部元素所用名称的复数形式。本机数组支持对象支持必须按照惯例表示对象,通常通过混合使用属性和元素。本机对象支持null支持需要对XML实例文档中的元素使用xsi:nil,加上导入对应的命名空间。在本机识别null值。注释本机支持,通常通过API来提供。不支持。命名空间支持命名空间,消除了组合文档时的名称冲突风险。命名空间还允许对现有基于XML的标准进行安全地扩展。无命名空间概念。通常通过嵌套对象或在对象成员名称中使用前缀(实际操作中以前者优先),来避免命名冲突。格式设置决定复杂。需要更多精力来决定如何将应用程序类型映射到XML元素和属性。会引起热烈争论,讨论以元素为中心还是以属性为中心的方法更好。简单。为应用程序数据提供更直接的映射。唯一例外是缺少日期/时间文字。大小文档有些冗长,尤其在使用以元素为中心的方法来设置格式时。语法非常简洁,产生的格式化文本中的大部分空间(理所当然)由所代表的数据使用。在JavaScript中分析需要XML DOM实现和其他应用程序代码,将文本映射回JavaScript对象。不需要其他应用程序代码便能够分析文本,可以使用JavaScript的eval函数。学习曲线通常需要同时使用多种技术:XPath、XML架构、XSLT、XML命名空间、DOM等。非常简单的技术层次,为具有JavaScript或其他动态编程语言背景的开发人员所熟悉。JSON是相对较新的数据交换格式,尚不具备XML目前所拥有的多年使用经历和供应商支持(虽然JSON正在快速赶超)。下表重点说明了XML和JSON领域中一些事件的当前状态。XML与JSON之间的支持区别支持XMLJSON工具具备由众多业界供应商广泛提供的一组成熟工具。尚不具备丰富的工具支持,如编辑器和格式化程序。Microsoft.NET Framework.NET Framework 1.0之后的版本具有非常优秀和成熟的支持。XML支持作为基类库(BCL)的一部分来提供。对于非托管环境,MSXML可发挥用武之地。目前尚无此功能,作为ASP.NET AJAX一部分的最初实现除外。平台和语言以众多平台和语言(商业和开源实现)提供了各种广泛使用的分析器和格式化程序。在众多平台上以多种语言提供了分析程序和格式化程序。有关完整的参考资料,请查询。目前的大多数实现都可能是开源项目。集成语言业界供应商当前正在试验语言内的字面支持。有关详细信息,请参见Microsoft的LINQ项目。仅在JavaScript/ECMAScript中提供本机支持。注意上表均不是比较点的完整列表。其实还可以从更多角度比较两种数据格式,但我们认为这些关键点足以构成一个初步印象。使用JavaScript创建和分析JSON消息将JSON用作数据交换格式时的两个常见任务是,将本机内存中的表示转换为其JSON文本表示,反之亦然。遗憾的是,在撰写文本时,JavaScript不提供可从给定对象或数组创建JSON文本的内置函数。这些方法预计将包含在2007年第四版的ECMAScript标准中。在JSON格式化函数正式添加到JavaScript并广泛用于常见实现之前,请使用可从下载的参考实现脚本。在撰写本文时的最新更新中,上的json.js脚本将toJSONString()函数添加到数组、字符串、布尔值、对象和其他JavaScript类型。该标量类型(如数字和布尔值)的toJSONString()函数相当简单,因为它们只需返回实例值的字符串表示形式。例如,如果值为true,Boolean类型的toJSONString()函数返回字符串true,否则返回false。数组和对象类型的toJSONString()函数则更有意思。对于Array实例,会依次调用每个所包含元素的toJSONString()函数,结果会以逗号进行连接从而分隔每个结果。最终输出会包括在方括号内。同样,对于Object实例,会枚举每个成员,并调用其toJSONString()函数。成员名称及其值的JSON表示形式在中间用冒号连接;每个成员名称和值对以逗号分隔,整个输出会包括在大括号内。toJSONString()函数的实际结果是,使用单个函数调用可将所有类型转换为其JSON格式。以下JavaScript使用详细和非文字方法(用于说明目的),创建了一个Array对象并特意添加了七个String元素。然后接着显示数组JSON表示形式:/josn.js must be included prior to this pointvar continents=new Array();continents.push(Europe);continents.push(Asia);continents.push(Australia);continents.push(Antarctica);continents.push(North America);continents.push(South America);continents.push(Africa);alert(The JSON representation of the continents array is:+continents.toJSONString();图1.toJSONString()函数生成根据JSON标准设置格式的数组。分析JSON文本甚至更加简单。由于JSON只是JavaScript文字的子集,因此可以使用将源JSON文本视为JavaScript源代码的eval(expr)函数,来分析内存中表示形式。eval函数接受输入有效JavaScript代码的字符串,并计算表达式结果。因此,下面一行代码是将JSON文本转换为本机表示形式所需的全部代码:var value=eval(+jsonText+);注意使用额外的圆括号可使eval将来源输入无条件地视为表达式。这对于对象来说尤其重要。如果您尝试使用包含JSON文本的字符串调用eval,其中该文本定义了对象,如字符串(表示空对象),那么它只会返回未定义作为分析结果。圆括号会强制JavaScript分析器将顶层大括号视为Object实例的文字表示法,而不是定义语句块的大括号。同样,如果顶层项是一个数组,如eval(1,2,3),也不会发生同样的问题。然而,出于一致性需要,在调用eval之前JSON文本应始终用圆括号括起来,以便分析来源时不会产生歧义。对文字表示法计算结果后,会返回与文字语法对应的实例,并将其赋值给value。请看下面的例子:它使用eval函数分析数组的文字表示法,并将得到的数组赋值给变量continents。var arrayAsJSONText=Europe,Asia,Australia,Antarctica,North America,South America,Africa;var continents=eval(arrayAsJSONText);alert(continents0+is one of the+continents.length+continents.);当然,实际操作中被计算结果的JSON文本会来自一些外部源,而不是像上述情况中被硬编码。eval函数会盲目地对它传递的任一表达式计算结果。不可靠的来源会因此包含具潜在危险的JavaScript,附带于或混入组成JSON数据的文字表示法。在来源不受信任的情况下,强烈建议您使用parseJSON()函数(位于json.js中)对JSON文本进行分析:/Requires json.js var continents=arrayAsJSONText.parseJSON();parseJSON()函数也使用eval,但仅限于arrayAsJSONText中包含的字符串符合JSON文本标准时。它通过一个更智能的正则表达式测试来完成这一操作。在.NET Framework中使用JSON JSON文本可依据JavaScript代码轻松地进行创建和分析,这是它的一个吸引人之处。但是,当JSON用于ASP.NET web应用程序时,只有浏览器受JavaScript支持,因为服务器端代码很可能是用Visual Basic或C#编写的。大多数为ASP.NET设计的Ajax库都支持以编程方式创建和分析JSON文本。因此,要在.NET应用程序中使用JSON,请考虑使用其中一个库。有众多的开源和第三方方案可供选择,而Microsoft也有自己的Ajax库,名为ASP.NET AJAX。在本文中,我们会介绍使用Jayrock的示例,它是一种用于Microsoft.NET Framework的JSON开源实现,由合著者Atif Aziz创建。我们选择使用Jayrock而非ASP.NET AJAX的原因有三个:Jayrock是开源的,可以按需要扩展或自定义。Jayrock可用于ASP.NET 1.x,、2.0和Mono应用程序,而ASP.NET AJAX仅限于ASP.NET 2.0版。Jayrock的作用域仅限于JSON和JSON-RPC,前者是本文的重点内容。ASP.NET AJAX包括对创建和分析JSON文本的一些支持,但它的主要用途是提供一个丰富的平台,在ASP.NET中构建端到端Ajax风格的web应用程序。您的重点内容为JSON时,额外的点缀性功能反而会让人分神。在.NET中通过Jayrock使用JSON,与在.NET Framework中通过XmlWriter、XmlReader和XmlSerializer类使用XML相似。位于Jayrock中的类JsonWriter、JsonReader、JsonTextWriter和JsonTextReader模拟.NET Framework类XmlWriter、XmlReader、XmlTextWriter和XmlTextReader的语义。这些类在低级别和面向流的级别与JSON交互时非常有用。使用这些类,可通过一系列的方法调用逐个创建或分析JSON文本。例如,使用JsonWriter类方法WriteNumber(number)可根据JSON标准写出适当的数字形式的字符串表示形式。JsonConvert类提供了用于在.NET类型和JSON之间进行转换的Export和Import方法。这些方法提供了分别与XmlSerializer类方法Serialize和Deserialize相似的功能。创建JSON文本以下代码说明了如何使用JsonTextWriter类来创建洲字符串数组的JSON文本。此JSON文本会发送到传入构造函数的TextWriter实例,在此示例中正好是来自控制台的输出流(在ASP.NET中您可以使用Response.Output):using(JsonTextWriter writer=JsonTextWriter(Console.Out)writer.WriteStartArray();writer.WriteString(Europe);writer.WriteString(Asia);writer.WriteString(Australia);writer.WriteString(Antarctica);writer.WriteString(North America);writer.WriteString(South America);writer.WriteString(Africa);writer.WriteEndArray();除了WriteStartArray、WriteString和WriteEndArray方法之外,JsonWriter类还提供了用于编写其他JSON值类型的方法,如WriteNumber、WriteBoolean、WriteNull等。WriteStartObject、WriteEndObject和WriteMember方法为对象创建JSON文本。以下示例说明了如何为了解JavaScript中的文字表示法部分探讨的联系对象创建JSON文本:private static void WriteContact()using(JsonWriter writer=new JsonTextWriter(Console.Out)writer.WriteStartObject();/writer.WriteMember(Name);/Name:writer.WriteString(John Doe);/John Doe,writer.WriteMember(PermissionToCall);/PermissionToCall:writer.WriteBoolean(true);/true,writer.WriteMember(PhoneNumbers);/PhoneNumbers:writer.WriteStartArray();/WritePhoneNumber(writer,/Location:Home,Home,555-555-1234);/Number:555-555-1234,WritePhoneNumber(writer,/Location:Work,Work,555-555-9999 Ext.123);/Number:555-555-9999 Ext.123writer.WriteEndArray();/writer.WriteEndObject();/private static void WritePhoneNumber(JsonWriter writer,string location,string number)writer.WriteStartObject();/writer.WriteMember(Location);/Location:writer.WriteString(location);/.,writer.WriteMember(Number);/Number:writer.WriteString(number);/.writer.WriteEndObject();/JsonConvert类中的Export和ExportToString方法可用于将指定的.NET类型序列化为JSON文本。例如,不需要使用JsonTextWriter类为七大洲数组手动构建JSON文本,以下对JsonConvert.ExportToString的调用即可产生相同的结果:string continents=Europe,Asia,Australia,Antarctica,North America,South America,Africa;string jsonText=JsonConvert.ExportToString(continents);分析JSON文本JsonTextReader类提供了各种分析JSON文本令牌的方法,其中核心的一种是Read。每次调用Read方法时,分析器会使用下一个令牌,可能是字符串值、数字值、对象成员名称、数组开头等。可能的话,可以通过Text属性访问当前令牌的已分析文本。例如,如果该读取器位于Boolean数据中,则Text属性会根据实际分析值返回true或false。以下示例代码使用JsonTextReader类,对包含七大洲名称的字符串数组的JSON文本表示形式进行分析。每个以字母A开头的洲会发送到控制台:string jsonText=Europe,Asia,Australia,Antarctica,North America,South America,Africa;using(JsonTextReader reader=new JsonTextReader(new StringReader(jsonText)while(reader.Read()if(reader.TokenClass=JsonTokenClass.String&reader.Text.StartsWith(A)Console.WriteLine(reader.Text);注意Jayrock中的JsonTextReader类是一个非常自由的JSON文本分析器。它实际上允许的语法要比RFC 4627中列出的规则所规定的有效JSON文本多得多。例如,就象在JavaScript中一样,JsonTextReader类允许单行和多行注释出现在JSON文本内。单行注释以双斜杠(/)开头,多行注释以斜杠星号(/*)开头,并以星号斜杠(*/)结尾。单行注释甚至能以井字号(#)开头,这在Unix样式的配置文件中十分常见。在所有实例中,分析器会完全跳过注释,不会通过API公开。和在JavaScript中一样,JsonTextReader允许以撇号()分隔JSON字符串。该分析器甚至可以容忍最后一个对象成员或者数组元素后面多余的逗号。即使具备所有这些附加内容,JsonTextReader仍是符合标准的分析器!而JsonTextWriter则只能产生严格符合标准的JSON文本。这遵循了通常所说的可靠性原则,即严以律己,宽以待人。要将JSON文本直接转换为.NET对象,请使用JsonConvert类导入方法,指定输出类型和JSON文本。以下示例显示了从JSON字符串数组到.NET字符串数组的转换:string jsonText=Europe,Asia,Australia,Antarctica,North America,South America,Africa;string continents=(string)JsonConvert.Import(typeof(string),jsonText);以下是一个更有意思的转换示例:取得RSS XML源,使用XmlSerializer将其反序列化为.NET类型,然后使用JsonConvert将该对象转换为JSON文本(将XML格式的RSS有效转换为JSON文本):XmlSerializer serializer=new XmlSerializer(typeof(RichSiteSummary);RichSiteSummary news;/Get the MSDN RSS feed and deserialize it.using(XmlReader reader=XmlReader.Create(=(RichSiteSummary)serializer.Deserialize(reader);/Export the RichSiteSummary object as JSON text,emitting the output to Console.Out using(JsonTextWriter writer=new JsonTextWriter(Console.Out)JsonConvert.Export(news,writer);注意可在本文附带的示例中找到RichSiteSummary定义及其相关类型。在ASP.NET中使用JSON我们已经介绍了如何在JavaScript中、以及通过Jayrock在.NET Framework中使用JSON,接下来我们来看一个关于在何处以及如何应用这些知识的实际示例。考虑ASP.NET 2.0的客户端脚本回调功能,它可简化web浏览器向ASP.NET页面(或向页面中的特定控件)发出带外调用的过程。在典型的回调情形中,浏览器中的客户端脚本将数据打包并回送到web服务器,由服务器端方法进行某些处理。从服务器收到响应数据后,客户端会用它来更新浏览器显示。注意可在MSDN杂志的文章ASP.NET 2.0中的脚本回调中找到更多信息。客户端回调情形中的难题在于,客户端和服务器只能来回运送一个字符串。因此,待交换的信息必须在发送前从本机内存中的表示形式转换为字符串,然后在收到后从字符串分析回本机内存中的表示形式。ASP.NET 2.0中的客户端脚本回调功能不要求进行交换的数据使用特定字符串格式,也不提供在本机内存中和字符串表示之间进行转换的任何内置功能;开发人员可以依据所选择的数据交换格式来实现转换逻辑。以下示例说明了如何在客户端脚本回调情形中将JSON用作数据交换格式。特别是,该示例由ASP.NET页面组成,此页面使用Northwind数据库中的数据,以下拉列表形式提供类别列表;选定类别中的产品则显示在项目符号列表中(请参见图3)。每当客户端更改下拉列表时,将发生回调并传入唯一元素为选定CategoryID的数组。注意我们传入的是包含选定CategoryID作为其唯一元素的数组(而不仅仅是CategoryID),因为JSON标准要求任何JSON文本都必须有对象或数组作为其根。当然,客户端不需要向服务器传递JSON文本,在此示例中本来可以只将选定的CategoryID作为字符串进行传递。但是,我们想要演示在回调的请求和响应消息中发送JSON文本。Page_Load事件处理程序的以下代码配置了Categories DropDownListWeb控件,以便在它发生更改时调用GetProductsForCategory函数,并传递选定的下拉列表值。如果传入的下拉列表值大于零,此函数会初始化客户端脚本回调:/Add client-side onchange event to drop-down list Categories.Attributesonchange=Categories_onchange(this);/Generate the callback script string callbackScript=ClientScript.GetCallbackEventReference(/*control*/this,/*argument*/+categoryID+,/*clientCallback*/showProducts,/*context*/null);/Add the Categories_onchange function ClientScript.RegisterClientScriptBlock(GetType(),Categories_onchange,function Categories_onchange(sender)clearResults();var categoryID=sender.value;if(categoryID 0)+callbackScript+,true);ClientScriptManager类中的GetCallBackEventReference方法用于生成可调用回调的JavaScript代码,具有以下签名:public string GetCallbackEventReference(Control control,string argument,string clientCallback,string context,)argument参数指定回调期间哪些数据会从客户端发送到web服务器,clientCallback参数则指定在回调完成时调用的客户端函数的名称(showProducts)。GetCallBackEventReference方法调用会生成以下JavaScript代码,并将它添加到呈现的标记中:WebForm_DoCallback(_Page,+categoryID+,showProducts,null,null,false)+categoryID+是回调期间传递到服务器的值(具有单个元素categoryID的数组),showProducts则是回调返回时执行的JavaScript函数。在服务器端,响应回调而执行的方法使用Jayrock的JsonConvert类来分析传入的JSON文本,并设置传出JSON文本的格式。特别值得注意的是,与选定类别相关的产品的名称都作为一个字符串数组进行检索并返回。/Deserialize the JSON text into an array of integers int args=(int)JsonConvert.Import(typeof(int),eventArgument);/Read the selected CategoryID from the array int categoryID=args0;/Get products based on categoryID NorthwindDataSet.ProductsRow rows=Northwind.Categories.FindByCategoryID(categoryID).GetProductsRows();/Load the names into astring array string productNames=new stringrows.Length;for(int i=0;i rows.Length;i+)productNamesi=rowsi.ProductName;/Serialize the string array as JSON text and return it to the clientreturn JsonConvert.ExportToString(productNames);注意JsonConvert类使用了两次-第一次是将eventArgument中的JSON文本转换为整数数组,第二次是将该字符串数组productNames转换为JSON文本,以返回到客户端。或者,我们也可以使用此处的JsonReader和JsonWriter类,但在涉及数据相对较小并易于映射到现有类型的情况下,JsonConvert可以将同样的工作做得相当好。数据从服务器端返回时,会调用依据GetCallBackEventReference方法指定的JavaScript函数,并传递返回值。此JavaScript方法showProducts以引用div元素ProductOutput开始。然后它会分析JSON响应,并动态添加无序列表,每个数组元素一个列表项。如果没有返回选定类别的产品,则会显示相应的消息。function showProducts(arg,context)/Dump the JSON text response from the server.document.forms0.JSONResponse.value=arg;/Parse JSON text returned from callback.var categoryProducts=eval(+arg+);/Get areference to the div ProductOutput.var output=document.getElementById(ProductOutput);/If no products for category,show message.if(categoryProducts.length=0)output.appendChild(document.createTextNode(There are no products for this category.);else/There are products,display them in an unordered list.var ul=document.createElement(ul);for(var i=0;i categoryProducts.length;i+)var product=categoryProductsi;var li=document.createElement(li);li.appendChild(document.createTextNode(product);ul.appendChild(li);output.appendChild(ul);图2说明了事件顺序,图3显示了此示例的运作过程;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 衢州职业技术学院《物流管理》2023-2024学年第二学期期末试卷
- 山东药品食品职业学院《民用建筑工程调研实训》2023-2024学年第二学期期末试卷
- 江门职业技术学院《专业文献检索与论文写作》2023-2024学年第二学期期末试卷
- 新疆艺术学院《自动控制理论》2023-2024学年第二学期期末试卷
- 海南健康管理职业技术学院《机械工程前沿》2023-2024学年第二学期期末试卷
- 广西中医药大学赛恩斯新医药学院《公共部门会计》2023-2024学年第二学期期末试卷
- 沈阳理工大学《水处理生物学》2023-2024学年第二学期期末试卷
- 2024年生物可降解塑料项目资金筹措计划书代可行性研究报告
- 文创产品设计赏析
- 2024年电子涂料项目投资申请报告代可行性研究报告
- 初中九年级数学课件-中考总复习-矩形的折叠问题
- 《国家审计准则解读》课件
- 糖尿病患者的药物治疗指导与管理
- 2023医美术后科学修护指南
- 2023年广西物流职业技术学院教师招聘考试笔试题库及答案
- 湖北省天门市2024届中考联考生物试题含解析
- 居民自建桩安装告知书回执
- 广佛环线佛山西站至广州北站段项目输电线路迁改工程环境影响报告表
- 翻译中的文化因素及文化负载词的处理
- 火龙罐技术课件
- 小学英语四年级下册Unit 1 Part B Read and write教学设计2
评论
0/150
提交评论