摘要

通过前两篇文章,我们知道使用了ASP.NET AJAX框架后,在JavaScript中调用后台WebService方法非常方便,几乎可以看做是“直接调用”。那么,这里引出了一个问题:调用方法就牵扯到参数的传递,而JavaScript和C#毕竟是两种不同的语言,数据类型怎么沟通?简单型数据类型还好说,如果我们需要的参数是个复杂类型呢?如分层架构中经常用到实体类做参数,我们在后台定义实体类类型,但是JavaScript可不知道这种定义,也没有相应数据类型,那么要如何解决这个问题呢?再进一步,如果需要的参数是个泛型集合呢?在JavaScript中又要如何表示这种类型?这一篇将解决这些问题。

先来看ASP.NET AJAX给你变个魔术

我们都知道,使用分层架构开发系统时,使用实体类作为参数很很普遍的。那么如果我们需要调用的某个后台方法中需要实体类做参数,应该如何进行呢?毕竟C#中定义的实体类在JavaScript中可不认识啊。先不要着急,跟我做以下几步,我们一起来看个魔术。

1.新建一个ASP.NET AJAX Enabled Web Site工程,并添加系统文件夹App_Code。

2.我们在App_Code里新建一个C#类文件StudentInfo.cs,其内容如下:

StudentInfo.cs:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt 1using System;
 2
 3[Serializable]
 4public class StudentInfo
 5{
 6    private string _name;
 7    private int _age;
 8    private string _college;
 9
10    public StudentInfo() { }
11
12    public string Name
13    {
14        get { return this._name; }
15        set { this._name = value; }
16    }
17
18    public int Age
19    {
20        get { return this._age; }
21        set { this._age = value; }
22    }
23
24    public string College
25    {
26        get { return this._college; }
27        set { this._college = value; }
28    }
29}

这是一个典型的实体类,相信做过分层架构的朋友一定经常使用到类似的代码。这里要特别注意两点:一是这个类上面有一个[Serializeable]属性,这表明此类可以被序列化,另外就是这个类有一个空的构造函数。

3.接着,我们在网站根目录下添加一个WebService:StudentService.asmx,其代码如下:

StudentService.cs:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt 1using System;
 2using System.Web;
 3using System.Collections;
 4using System.Web.Services;
 5using System.Web.Services.Protocols;
 6using System.Web.Script.Services;
 7
 8[WebService(Namespace = "http://tempuri.org/")]
 9[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
10[ScriptService]
11[GenerateScriptType(typeof(StudentInfo))]
12public class StudentService : System.Web.Services.WebService
13{
14    public StudentService() { }
15
16    [WebMethod]
17    public string ShowStudentInfo(StudentInfo student)
18    {
19        return "学生姓名:" + student.Name + "
年龄:" + student.Age + "
所在院系:" + student.College;
20    }
21}

ShowStudentInfo这个方法接收一个StudentInfo类型的参数,并根据这个实体类的信息组合成一段字符串返回。

4.接着,在网站根目录下新建一个ajax.js文件,内容如下:

ajax.js:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt 1function btnShowStudentInfo_onClick()
 2{
 3    var student=new StudentInfo();
 4    student.Name="张无忌";
 5    student.Age="20";
 6    student.College="计算机学院";
 7    
 8    StudentService.ShowStudentInfo(student,CallBackFunction);
 9}
10
11function CallBackFunction(responseText)
12{
13    $get("result").innerHTML=responseText;
14}

这里我们大胆的直接初始化了一个StudentInfo,为什么说大胆呢?不要忘了,我们的StudentInfo类型可是在C#中定义的,JavaScript里可压根没有这个类型,当时我们这里却好像在写C#似的,不但初始化了这个类,还给其中成员赋值,并且当作参数传给了后台方法。这样能成功吗?我们接着看看吧。

5.Default.aspx作为主页,我们添加如下内容:

Default.aspx:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt 1@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
 2
 3DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
 4<html xmlns="http://www.w3.org/1999/xhtml">
 5<head runat="server">
 6    <title>复杂类型自动转换测试title>
 7head>
 8<body>
 9    <form id="form1" runat="server">
10        <asp:ScriptManager ID="ScriptManager1" runat="server">
11            <Scripts>
12                <asp:ScriptReference Path="~/ajax.js" />
13            Scripts>
14            <Services>
15                <asp:ServiceReference Path="~/StudentService.asmx" />
16            Services>
17        asp:ScriptManager>
18        <div>
19            <input id="btnShowStudentInfo" type="button" value="ShowStudentInfo" onclick="btnShowStudentInfo_onClick()" />
20            <div id="result">div>
21        div>
22    form>
23body>
24html>

这里就不用做过多解释了,看过前两篇的朋友肯定很容易就明白这段代码是什么意思。运行后,我们单击按钮,得到如下效果:

可以看到,不仅程序运行没有报错,而且我们在JavaScript中定义的实体类被传到后台,并神奇的变成了C#实体类,作为参数完成了数据传递工作。运行结果非常令人满意。

魔术揭秘

在上面的例子中,我们没有在JavaScript定义StudentInfo,更没有写代码把JavaScript实体类转换成C#实体类,但是程序正确执行了。很显然,有人替我们做了这一切,那是谁呢?当然是我们亲爱的ASP.NET AJAX。这就是这个框架另一项神奇的功能:前后台间数据类型自动转换,这个转换可不仅包括简单类型,还包括像实体类这样的复杂类型。那么,其工作原理是什么呢?

仔细看StudentService.cs的代码,在类定义的上面,有一个[GenerateScriptTyep(typeof(StudentInfo))] 属性,秘诀就在这里。当我们给WebService类加上这条属性时,ASP.NET AJAX会在运行时自动为我们生成一个JavaScript版本的StudentInfo类,这个类的所有属性都和C#版的一模一样。所以,我们在JavaScript中实例化并赋值的其实是一个JavaScript版的StudentInfo。而后,当我们调用ShowStudentInfo方法时,ASP.NET AJAX框架会自动将JavaScript版的StudentInfo序列化成JOSN字符串,然后传到后台,后台再将这段字符串反序列化成C#版的StudentInfo,并作为参数传递给ShowStudentInfo,从而顺利完成工作。

当然,如果某个后台方法返回一个StudentInfo类型的返回值,它也可以准确无误从C#传到JavaScript中。也就是说,序列化和反序列化都是双向的。

自动转换的条件

知道了上述原理,那么如何才能自动转换呢?或者说具备什么条件的复杂类型才可以自动转换呢?大约有以下几点:

1.需要在WebService中使用[GenerateScriptTyep()]属性指明要自动生成的复杂数据类型。

2.该复杂类型必须有一个无参数的构造函数。

3.该复杂类型的所有公有属性必须有get和set方法。

另外值得注意的是,生成的JavaScript版本类只包含原类的公有属性,而私有属性和方法是不会映射过来的。应该说,这个技术对使用分层架构的应用特别有用,因为可以直接在客户端使用服务器端的实体类进行数据传输。

ASP.NET AJAX到底能自动转换哪些数据类型?

1.基本类型将被转换为基本类型。如整形、浮点型、字符串、布尔型、DateTime等。(全自动转换)

2.枚举类型将被转换为枚举类型。(全自动转换)

3.复杂类型将转换为同名复杂类型,但只保留公有属性。(需要使用[GenerateScriptTyep(typeof(TypeName))]属性声明)

4.数组、泛型集合将转换为数组。(全自动转换)

5.DataTable将转换为JavaScript版的DataTable,但是需要ASP.NET Futures CTP的支持。

结束语

这一篇中介绍了ASP.NET AJAX中非常有用的一个特性:数据类型自动转换。通过这个功能,使得前台可以更方便的调用后台程序。尤其是使用实体类传递数据会变得非常方便。在下一篇中,将介绍客户端组件的概念、使用客户端组件思想进行JavaScript开发以及简化的DOM操作。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12639172/viewspace-408758/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12639172/viewspace-408758/

【T2噬菌体】ASP.NET AJAX客户端编程之旅(三)—数据转换序列化相关推荐

  1. 【T2噬菌体】ASP.NET AJAX客户端编程之旅(二)——知其所以然

    摘要 在上一篇文章中,做了一个"Hello!ASP.NET AJAX"的小例子,但是并没有对其中的技术做解释.这一篇中,将探讨一下使用ASP.NET AJAX框架在客户端调用后台代 ...

  2. ASP.NET AJAX客户端编程之旅(二)——知其所以然

    摘要 在上一篇文章中,做了一个"Hello!ASP.NET AJAX"的小例子,但是并没有对其中的技术做解释.这一篇中,将探讨一下使用ASP.NET AJAX框架在客户端调用后台代 ...

  3. 【T2噬菌体】ASP.NET AJAX客户端编程之旅(一)——Hello!ASP.NET AJAX

    摘要 本文将首先介绍一下文章的写作背景和用到的相关技术.然后将分别使用朴素的Ajax技术和ASP.NET AJAX框架分别实现经典的"Hello!XX",通过两个小例子,使朋友们对 ...

  4. 错误: asp.net ajax 客户端框架未能加载.,ASP.NET Ajax 客户端框架未能加载、Sys未定义...

    在Windows Server 2003 系统上部署asp.net项目出现以下问题: IIS为6.0 导致菜单控件的图片显示不出来: WebSite:程序中的图片显示正常. 但用到ASP.net 2. ...

  5. 探讨ASP.NET AJAX客户端开发技术

    一. 简介     在ASP.NET AJAX组件开发中,存在许多环节有待我们深入挖掘.如何让ASP.NET AJAX服务端控件更有效地利用客户端脚本来为控件添加强大的客户端功能?如何更为方便地访问控 ...

  6. Asp.net Ajax 客户端页面生命周期原生事件

    init Event [初始化事件]    在所有脚本被加载后,在任何一个对象被创建之前引发该事件.如果你打算写一个组件(脚本),init 事件提供了一个在生命周期内添加组件(脚本)到页面的点.该组件 ...

  7. ASP.NET AJAX Advance Tips Tricks (11) 三种方法动态创建Tooltip

    前言 如何动态创建提示框(Tooltip)是ASP.NET Forum里的常见问题之一,在做技术支持时,我曾在英文博客上总结过ASP.NET和ASP.NET AJAX环境下如何动态创建提示框的三种常见 ...

  8. ScriptManager导致ASP.NET Ajax 客户端框架未能加载。Uncaught ReferenceError: Type is not defined

    环境 windows server 2016 iis .net4.5 解决办法:IIS 项目对应的应用程序程序池

  9. 《ASP.NET AJAX程序设计——第II卷:客户端Microsoft AJAX Library相关》定稿+详细章节列表...

    篇幅和第I卷相仿,内容则专注于客户端相关部分.该书现已定稿,正处于出版过程中.下面是详细的章节目录,我也会尽快和出版社.相关网站等沟通,开放试读: 第0章 客户端与服务器端编程模型 0.1 将表现层逻 ...

最新文章

  1. 爬虫python课程价位,用python编写的抓京东商品价格的爬虫
  2. html如何创建学生信息表,创建学生对象并且能访问网页
  3. R语言-Kindle特价书爬榜示例 输出HTML小技巧
  4. MZOJ 1345 hero
  5. [建议]添加模板功能
  6. F - 上升子序列-超详细注释版
  7. sql 可以多个分组吗_你知道吗?罗非鱼的品种多达100多个,不单是食用鱼也可以是观赏鱼...
  8. SQLServer收缩数据库日志
  9. 2.5. 标准路由器:Zend_Controller_Router_Rewrite
  10. rt3290 linux驱动下载,Ralink RT3290无线网卡驱动安装 (linux)
  11. oppo r11s鸿蒙固件,OPPO R11s刷机包
  12. ITIL4服务管理的新思路与实践案例介绍
  13. atv320说明书_ATV320U30N4B 施耐德 ATV320通用变频器 说明书
  14. S3C2440 GPIO控制器
  15. 华硕天选笔记本电脑启动机器后搜索不到网络
  16. ubuntu三行命令更新谷歌浏览器版本
  17. 软件安全技术(概述、堆栈漏洞)总结
  18. Autosar MCAL-ADC详解(二)-基于Tc27x的cfg软件
  19. 法拉帝港股上市:市值76亿港元 9个月交付179艘游艇
  20. 智微JMS901量产工具软件+固件,JMS901双接口U盘成功量产教程分享

热门文章

  1. alias命令在linux/unix下的使用
  2. 2020ICPC EC-Final D. City Brain
  3. 2023最新装修材料石膏线品牌加盟类模板源码+织梦内核开发的
  4. 领扣LintCode问题答案-55. 比较字符串
  5. 高级特效开发阶段学习总结
  6. 向量空间模型算法( Vector Space Model )
  7. 操作系统中常用的几种进程调度算法
  8. url html 加密 php,php实现URL加密解密
  9. 1045:收集瓶盖赢大奖
  10. 创业故事:公司的形象和口碑建设