国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
ASP.NET AJAX客戶端編程教程(3)——讓JavaScript和C#無(wú)障礙溝通:數(shù)...

ASP.NET AJAX客戶端編程教程(3)——讓JavaScript和C#無(wú)障礙溝通:數(shù)據(jù)類型自動(dòng)轉(zhuǎn)換&序列化

摘要

通過(guò)前兩篇文章,我們知道使用了ASP.NET AJAX框架后,在JavaScript中調(diào)用后臺(tái)WebService方法非常方便,幾乎可以看做是“直接調(diào)用”。那么,這里引出了一個(gè)問(wèn)題:調(diào)用方法就牽扯到參數(shù)的傳遞,而JavaScript和C#畢竟是兩種不同的語(yǔ)言,數(shù)據(jù)類型怎么溝通?簡(jiǎn)單型數(shù)據(jù)類型還好說(shuō),如果我們需要的參數(shù)是個(gè)復(fù)雜類型呢?如分層架構(gòu)中經(jīng)常用到實(shí)體類做參數(shù),我們?cè)诤笈_(tái)定義實(shí)體類類型,但是JavaScript可不知道這種定義,也沒(méi)有相應(yīng)數(shù)據(jù)類型,那么要如何解決這個(gè)問(wèn)題呢?再進(jìn)一步,如果需要的參數(shù)是個(gè)泛型集合呢?在JavaScript中又要如何表示這種類型?這一篇將解決這些問(wèn)題。

先來(lái)看ASP.NET AJAX給你變個(gè)魔術(shù)

我們都知道,使用分層架構(gòu)開(kāi)發(fā)系統(tǒng)時(shí),使用實(shí)體類作為參數(shù)很很普遍的。那么如果我們需要調(diào)用的某個(gè)后臺(tái)方法中需要實(shí)體類做參數(shù),應(yīng)該如何進(jìn)行呢?畢竟C#中定義的實(shí)體類在JavaScript中可不認(rèn)識(shí)啊。先不要著急,跟我做以下幾步,我們一起來(lái)看個(gè)魔術(shù)。

1.新建一個(gè)ASP.NET AJAX Enabled Web Site工程,并添加系統(tǒng)文件夾App_Code。

2.我們?cè)贏pp_Code里新建一個(gè)C#類文件StudentInfo.cs,其內(nèi)容如下:

StudentInfo.cs:

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}

這是一個(gè)典型的實(shí)體類,相信做過(guò)分層架構(gòu)的朋友一定經(jīng)常使用到類似的代碼。這里要特別注意兩點(diǎn):一是這個(gè)類上面有一個(gè)[Serializeable]屬性,這表明此類可以被序列化,另外就是這個(gè)類有一個(gè)空的構(gòu)造函數(shù)。

3.接著,我們?cè)诰W(wǎng)站根目錄下添加一個(gè)WebService:StudentService.asmx,其代碼如下:

StudentService.cs:

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 "學(xué)生姓名:" + student.Name + "<br />年齡:" + student.Age + "<br />所在院系:" + student.College;
20 }
21}

ShowStudentInfo這個(gè)方法接收一個(gè)StudentInfo類型的參數(shù),并根據(jù)這個(gè)實(shí)體類的信息組合成一段字符串返回。

4.接著,在網(wǎng)站根目錄下新建一個(gè)ajax.js文件,內(nèi)容如下:

ajax.js:

1function btnShowStudentInfo_onClick()
2{
3 var student=new StudentInfo();
4 student.Name="張無(wú)忌";
5 student.Age="20";
6 student.College="計(jì)算機(jī)學(xué)院";
7
8 StudentService.ShowStudentInfo(student,CallBackFunction);
9}
10
11function CallBackFunction(responseText)
12{
13 get("result").innerHTML=responseText;
14}

這里我們大膽的直接初始化了一個(gè)StudentInfo,為什么說(shuō)大膽呢?不要忘了,我們的StudentInfo類型可是在C#中定義的,JavaScript里可壓根沒(méi)有這個(gè)類型,當(dāng)時(shí)我們這里卻好像在寫(xiě)C#似的,不但初始化了這個(gè)類,還給其中成員賦值,并且當(dāng)作參數(shù)傳給了后臺(tái)方法。這樣能成功嗎?我們接著看看吧。

5.Default.aspx作為主頁(yè),我們添加如下內(nèi)容:

Default.aspx:

1<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
2
3<!DOCTYPE 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>復(fù)雜類型自動(dòng)轉(zhuǎn)換測(cè)試http://dwww.cn </title>
7</head>
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>
23</body>
24</html>

這里就不用做過(guò)多解釋了,看過(guò)前兩篇的朋友肯定很容易就明白這段代碼是什么意思。運(yùn)行后,我們單擊按鈕,得到如下效果:

可以看到,不僅程序運(yùn)行沒(méi)有報(bào)錯(cuò),而且我們?cè)贘avaScript中定義的實(shí)體類被傳到后臺(tái),并神奇的變成了C#實(shí)體類,作為參數(shù)完成了數(shù)據(jù)傳遞工作。運(yùn)行結(jié)果非常令人滿意。

魔術(shù)揭秘

在上面的例子中,我們沒(méi)有在JavaScript定義StudentInfo,更沒(méi)有寫(xiě)代碼把JavaScript實(shí)體類轉(zhuǎn)換成C#實(shí)體類,但是程序正確執(zhí)行了。很顯然,有人替我們做了這一切,那是誰(shuí)呢?當(dāng)然是我們親愛(ài)的ASP.NET AJAX。這就是這個(gè)框架另一項(xiàng)神奇的功能:前后臺(tái)間數(shù)據(jù)類型自動(dòng)轉(zhuǎn)換,這個(gè)轉(zhuǎn)換可不僅包括簡(jiǎn)單類型,還包括像實(shí)體類這樣的復(fù)雜類型。那么,其工作原理是什么呢?

仔細(xì)看StudentService.cs的代碼,在類定義的上面,有一個(gè)[GenerateScriptTyep(typeof(StudentInfo))] 屬性,秘訣就在這里。當(dāng)我們給WebService類加上這條屬性時(shí),ASP.NET AJAX會(huì)在運(yùn)行時(shí)自動(dòng)為我們生成一個(gè)JavaScript版本的StudentInfo類,這個(gè)類的所有屬性都和C#版的一模一樣。所以,我們?cè)贘avaScript中實(shí)例化并賦值的其實(shí)是一個(gè)JavaScript版的StudentInfo。而后,當(dāng)我們調(diào)用ShowStudentInfo方法時(shí),ASP.NET AJAX框架會(huì)自動(dòng)將JavaScript版的StudentInfo序列化成JOSN字符串,然后傳到后臺(tái),后臺(tái)再將這段字符串反序列化成C#版的StudentInfo,并作為參數(shù)傳遞給ShowStudentInfo,從而順利完成工作。

當(dāng)然,如果某個(gè)后臺(tái)方法返回一個(gè)StudentInfo類型的返回值,它也可以準(zhǔn)確無(wú)誤從C#傳到JavaScript中。也就是說(shuō),序列化和反序列化都是雙向的。

自動(dòng)轉(zhuǎn)換的條件

知道了上述原理,那么如何才能自動(dòng)轉(zhuǎn)換呢?或者說(shuō)具備什么條件的復(fù)雜類型才可以自動(dòng)轉(zhuǎn)換呢?大約有以下幾點(diǎn):

1.需要在WebService中使用[GenerateScriptTyep()]屬性指明要自動(dòng)生成的復(fù)雜數(shù)據(jù)類型。

2.該復(fù)雜類型必須有一個(gè)無(wú)參數(shù)的構(gòu)造函數(shù)。

3.該復(fù)雜類型的所有公有屬性必須有g(shù)et和set方法。

另外值得注意的是,生成的JavaScript版本類只包含原類的公有屬性,而私有屬性和方法是不會(huì)映射過(guò)來(lái)的。應(yīng)該說(shuō),這個(gè)技術(shù)對(duì)使用分層架構(gòu)的應(yīng)用特別有用,因?yàn)榭梢灾苯釉诳蛻舳耸褂梅?wù)器端的實(shí)體類進(jìn)行數(shù)據(jù)傳輸。

ASP.NET AJAX到底能自動(dòng)轉(zhuǎn)換哪些數(shù)據(jù)類型?

1.基本類型將被轉(zhuǎn)換為基本類型。如整形、浮點(diǎn)型、字符串、布爾型、DateTime等。(全自動(dòng)轉(zhuǎn)換)

2.枚舉類型將被轉(zhuǎn)換為枚舉類型。(全自動(dòng)轉(zhuǎn)換)

3.復(fù)雜類型將轉(zhuǎn)換為同名復(fù)雜類型,但只保留公有屬性。(需要使用[GenerateScriptTyep(typeof(TypeName))]屬性聲明)

4.數(shù)組、泛型集合將轉(zhuǎn)換為數(shù)組。(全自動(dòng)轉(zhuǎn)換)

5.DataTable將轉(zhuǎn)換為JavaScript版的DataTable,但是需要ASP.NET Futures CTP的支持。

結(jié)束語(yǔ)

這一篇中介紹了ASP.NET AJAX中非常有用的一個(gè)特性:數(shù)據(jù)類型自動(dòng)轉(zhuǎn)換。通過(guò)這個(gè)功能,使得前臺(tái)可以更方便的調(diào)用后臺(tái)程序。尤其是使用實(shí)體類傳遞數(shù)據(jù)會(huì)變得非常方便。在下一篇中,將介紹客戶端組件的概念、使用客戶端組件思想進(jìn)行JavaScript開(kāi)發(fā)以及簡(jiǎn)化的DOM操作。

本文用到的實(shí)例可以在這里下載:AutoConvertionTest.rar

主要參考文獻(xiàn)

[1] 陳黎夫,ASP.NET AJAX程序設(shè)計(jì)-第II卷:客戶端,人民郵電出版社,2007年10月

  來(lái)源:http://www.cnblogs.com/leoo2sk

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
ASP.NET MVC學(xué)習(xí)系列(二)
SpringMVC中出現(xiàn)“ 400 Bad Request ”錯(cuò)誤(用@ResponseBody處理ajax傳過(guò)來(lái)的json數(shù)據(jù)轉(zhuǎn)成bean)的解決方法
ASP.NET MVC4 IN ACTION學(xué)習(xí)筆記
本周ASP.NET英文技術(shù)文章推薦[03/25 - 03/31]
Jquery Cross
CSS JavaScript面試題
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服