日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
ASP.NET中定義JavaScriptConverter

有時候在Web Service中會需要使用到比較復(fù)雜的類型,它們的特征往往都是含用循環(huán)引用,這樣的對象如果交給ASP.NET AJAX中默認(rèn)的序列化方式來處理則會拋出異常,大家經(jīng)常遇到的“DataTable”問題正是由此引起的。關(guān)于這一點(diǎn),ASP.NET AJAX自然提供了解決方法,在這里“官方”的解決方案就是JavaScriptConverter,它可以讓開發(fā)人員自定義特定類型的序列化能力。

創(chuàng)新互聯(lián)是專業(yè)的中山網(wǎng)站建設(shè)公司,中山接單;提供成都網(wǎng)站設(shè)計、成都做網(wǎng)站,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行中山網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!

事實(shí)上,需要自定義JavaScriptConverter的類型不止“含有循環(huán)引用”的類型,事實(shí)上,JavaScriptConverter的目標(biāo)是“ASP.NET AJAX中無法操作,或者結(jié)果不是開發(fā)人員所期望那樣”的類型,這里的“操作”包括“序列化”于“反序列化”兩部分。再舉個例子:如果一個類型沒有無參數(shù)的構(gòu)造函數(shù),那么也需要定義JavaScriptConverter,否則ASP.NET AJAX無法對其進(jìn)行反序列化操作。

那么我們就通過一個簡單的例子來看一下應(yīng)該如何開發(fā)和使用JavaScriptConverter吧。

1、定義存在循環(huán)引用的類型

首先我們定義一個Boy類和Girl類以供使用:

 
 
 
  1. public class Boy  
  2. {  
  3. public string Name;  
  4. public Girl GirlFriend;  
  5. }  
  6. public class Girl  
  7. {  
  8. public string Name;  
  9. public Boy BoyFriend;  

很顯然,如果我將它們“配成一對”,在序列化輸出時就會拋出異常了。就沖著這點(diǎn),我們就必須定義一個JavaScriptConverter啊,總不能拆散他倆。

2、定義JavaScriptConverter以及序列化能力

我們下面就該開始定義JavaScriptConverter了,我們姑且將其稱之為BoyConverter。首先需要告訴ASP.NET,我們這個Converter可以支持哪些類型:

 
 
 
  1. public class BoyConverter : JavaScriptConverter  
  2. {  
  3. public override IEnumerable SupportedTypes  
  4. {  
  5. get  
  6. {  
  7. yield return typeof(Boy);  
  8. }  
  9. }  
  10. ……  

如果要實(shí)現(xiàn)一個比較良好的Serialize方法,就需要處理“有循環(huán)引用”和“沒有循環(huán)引用”兩種情況。幸運(yùn)的是,對于Serialize方法來說,這點(diǎn)比較容易:

 
 
 
  1. public override IDictionary, object> Serialize(object obj, 
    JavaScriptSerializer serializer)  
  2. {  
  3. IDictionary, object> result = new Dictionary, object>();  
  4. Boy boy = (Boy)obj;  
  5. result["Name"] = boy.Name;  
  6. // 如果有GirlFriend引用  
  7.     if (boy.GirlFriend != null)  
  8. {  
  9. // 摘除循環(huán)引用  
  10.         boy.GirlFriend.BoyFriend = null;  
  11. result["GirlFriend"] = boy.GirlFriend;  
  12. // 在客戶端再建立關(guān)聯(lián)  
  13.         result["__getRealObject"] =  
  14. "function(o) { oo.GirlFriend.BoyFriend = o; return o; }";  
  15. }  
  16. return result;  

在這里,我們“手動”地將Boy對象轉(zhuǎn)換為了一個IDictionary,這樣就避免出現(xiàn)了循環(huán)引用。另外,為了在客戶端直接得到一個互相引用的“Boy”和“Girl”對象,我在這里使用了我在前一片文章中提到的擴(kuò)展,具體請見《深入Atlas系列:綜合示例(1) - 調(diào)用服務(wù)器端方法時直接獲得客戶端具體類型》。

3、自定義序列化功能使用示例

那么我們來看一下使用示例吧,首先我們需要定義一個Web Service方法:

 
 
 
  1. [WebService(Namespace = "http://tempuri.org/")]  
  2. [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]  
  3. [Microsoft.Web.Script.Services.ScriptService]  
  4. public class BoyGirlService  : System.Web.Services.WebService {  
  5. [WebMethod]  
  6. public Boy GetBoy(string boyName, string girlName)  
  7. {  
  8. Boy boy = new Boy();  
  9. boy.Name = boyName;  
  10. if (!String.IsNullOrEmpty(girlName))  
  11. {  
  12. Girl girl = new Girl();  
  13. girl.Name = girlName;  
  14. girl.BoyFriend = boy;  
  15. boy.GirlFriend = girl;  
  16. }  
  17. return boy;  
  18. }  

以上介紹在ASP.NET中定義JavaScriptConverter

【編輯推薦】

  1. ASP.NET中的WebRequestExecutor
  2. IIS6的ASP.NET ISAPI請求處理過程
  3. ASP.NET中的備份
  4. 淺談ASP.NET ISAPI
  5. ASP.NET的IIS ISAPI extension

本文標(biāo)題:ASP.NET中定義JavaScriptConverter
標(biāo)題URL:http://m.5511xx.com/article/dheocgc.html