成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ASP.NET的TypeConverter

開(kāi)發(fā) 后端
本文介紹ASP.NET的TypeConverter,我們通過(guò)示例,一步一步地來(lái)查看如何在Atlas中使用自定義TypeConverter。

TypeConverter對(duì)于編寫(xiě)ASP.NET Server Control的朋友可謂是再熟悉不過(guò)了。我們通過(guò)示例,一步一步地來(lái)查看如何在Atlas中使用自定義TypeConverter。

JavaScriptConverter類(lèi)的作用是提供了開(kāi)發(fā)人員自定義序列化與反序列化的能力,這一點(diǎn)對(duì)于操作含有循環(huán)引用的復(fù)雜對(duì)象尤其重要。這個(gè)類(lèi)在RTM Release中的功能被精簡(jiǎn)了。它的方法和屬性被縮減成了三個(gè):

1. IEnumerable<Type> SupportedTypes:只讀屬性,返回這個(gè)Converter所有能夠支持的類(lèi)。

2. object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer):

這個(gè)方法的***個(gè)參數(shù)是一個(gè)字典,有朋友可能會(huì)認(rèn)為這個(gè)字典和JSON字符串的表示非常的接近:由Dictionary和List嵌套而成,***端的元素為一些基本類(lèi)型對(duì)象。不過(guò)事實(shí)上不是如此。ASP.NET AJAX在反序列化一個(gè)JSON字符串時(shí),如果出現(xiàn)了“{ "__type" : "...", ...}” 這樣的片斷時(shí),在將其轉(zhuǎn)換為真正的JSON表示的Dictionary(只存在基本類(lèi)型對(duì)象的Dictionary)之后,如果發(fā)現(xiàn)該 Dictionary存在“__type”這個(gè)Key,那么就會(huì)設(shè)法在這個(gè)時(shí)候就將它轉(zhuǎn)換為_(kāi)_type值表示的那個(gè)類(lèi)型了。也就是說(shuō), JavaScriptConverter的Deserialize方法接受到的***個(gè)參數(shù)字典中,也有可能已經(jīng)是一個(gè)特殊的類(lèi)型了。

第二個(gè)參數(shù)為轉(zhuǎn)換的目標(biāo)類(lèi)型。而第三個(gè)參數(shù),則是調(diào)用當(dāng)前Deserialize方法的JavaScriptSerializer了,我們的一些反序列化操作可以委托給它執(zhí)行,它已經(jīng)關(guān)聯(lián)好了web.config中配置的JavaScriptConverter。不過(guò)需要注意的就是,千萬(wàn)要避免下一步操作又沒(méi)有改變地回到了當(dāng)前的Deserialize方法,顯然這樣會(huì)出現(xiàn)死循環(huán)。

3. IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer):這個(gè)方法的作用相對(duì)純粹一些,將obj對(duì)象轉(zhuǎn)換為一個(gè)IDictionary<string, object>對(duì)象,在這個(gè)方法將結(jié)果返回后,ASP.NET AJAX會(huì)在這個(gè)Dictionary中添加“__type”的值,這樣的話(huà),在反序列化時(shí)也能夠使用當(dāng)前的JavaScriptConverter來(lái)進(jìn)行相反的操作。

首先,定義一個(gè)復(fù)雜類(lèi)型Employee:

  1. [TypeConverter(typeof(EmployeeConverter))]  
  2. public class Employee  
  3. {  
  4. public string Name;  
  5. public int Age;  

可以看到,我們使用了TypeConverterAttribute將稍后會(huì)講解的EmployeeConverter關(guān)聯(lián)到Employee上。

接著,和上一個(gè)例子一樣,我們寫(xiě)一個(gè)支持HTTP GET訪問(wèn)的Web Services方法,只是參數(shù)使用了復(fù)雜類(lèi)型。

  1. [WebService(Namespace = "http://tempuri.org/")]  
  2. [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]  
  3. public class HttpGetEmployeeService  : System.Web.Services.WebService {  
  4.  
  5. [WebMethod]  
  6. [WebOperation(true, ResponseFormatMode.Xml)]  
  7. public XmlDocument SubmitEmployee(Employee employee)  
  8. {  
  9. XmlDocument responseDoc = new XmlDocument();  
  10. responseDoc.LoadXml(  
  11. "<?xml-stylesheet type=\"text/xsl\" href=\"Employee.xsl\"?>" +  
  12. "<Employee><Name></Name><Age></Age></Employee>");  
  13. responseDoc.SelectSingleNode("http://Name").InnerText = employee.Name;  
  14. responseDoc.SelectSingleNode("http://Age").InnerText = employee.Age.ToString();  
  15. return responseDoc;  
  16. }  

然后是所需的Xslt文件:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <xsl:stylesheet version="1.0" 
  3. xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
  4. <xsl:template match="/Employee"> 
  5. <html> 
  6. <head> 
  7. <title>Thanks for your participation</title> 
  8. </head> 
  9. <body style="font-family:Verdana; font-size:13px;"> 
  10. <h4>Here's the employee you submitted:</h4> 
  11. <div> 
  12. <xsl:text>Name: </xsl:text> 
  13. <xsl:value-of select="Name" /> 
  14. </div> 
  15. <div> 
  16. <xsl:text>Age: </xsl:text> 
  17. <xsl:value-of select="Age" /> 
  18. </div> 
  19. </body> 
  20. </html> 
  21. </xsl:template> 
  22. </xsl:stylesheet>  

上面這些對(duì)于看過(guò)之前一片文章的朋友們來(lái)說(shuō)應(yīng)該很熟悉。接下來(lái),我們就進(jìn)入正題,定義一個(gè)EmployeeConverter。代碼如下:

  1. public class EmployeeConverter : TypeConverter  
  2. {  
  3. public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)  
  4. {  
  5. if (sourceType == typeof(String))  
  6. {  
  7. return true;  
  8. }  
  9.  
  10. return false;  
  11. }  
  12.  
  13. public override object ConvertFrom(ITypeDescriptorContext context, 
    CultureInfo culture, object value)  
  14. {  
  15. IDictionary<string, object> dictObj =  
  16. JavaScriptObjectDeserializer.DeserializeDictionary(value.ToString());  
  17.  
  18. Employee emp = new Employee();  
  19. emp.Name = dictObj["Name"].ToString();  
  20. emp.Age = (int)dictObj["Age"];  
  21.  
  22. return emp;  
  23. }  

EmployeeConverter繼承了TypeConverter,首先覆蓋CanConvertFrom方法表明使用EmployeeConverter可以將一個(gè)String轉(zhuǎn)換成另一個(gè)對(duì)象。接著在覆蓋 ConvertFrom方法,將傳入的value值轉(zhuǎn)換為一個(gè)復(fù)雜對(duì)象Employee。這里為了方便,我們把Employee對(duì)象在客戶(hù)端JOSN序列化,然后在服務(wù)器端再序列化回來(lái),事實(shí)上,這種基礎(chǔ)類(lèi)型到復(fù)雜類(lèi)型的轉(zhuǎn)換,完全可以使用任何方式。

代碼都非常簡(jiǎn)單,也容易理解,因此我們直接看一下使用代碼。由于代碼很少,就將Javascript和HTML一并貼出了:

  1. <html xmlns="http://www.w3.org/1999/xhtml" > 
  2. <head> 
  3. <title>Convert Primitive Object using Customized TypeConverter</title> 
  4. <script language="javascript"> 
  5. function submitEmployee()  
  6. {  
  7. var emp = new Object();  
  8. emp.Name = $("txtName").value;  
  9. emp.Age = parseInt($("txtAge").value, 10);  
  10.  
  11. var serializedEmp = Sys.Serialization.JSON.serialize(emp);  
  12. var url = "HttpGetEmployeeService.asmx?mn=SubmitEmployee&employee=" + 
    encodeURI(serializedEmp);  
  13. window.open(url);  
  14. }  
  15. </script> 
  16. </head> 
  17. <body style="font-family:Verdana; font-size:13px;"> 
  18. <form runat="server"> 
  19. <atlas:ScriptManager ID="ScriptManager1" runat="server" /> 
  20.  
  21. <div>Name:<input type="text" id="txtName" /></div> 
  22. <div>Age:<input type="text" id="txtAge" /></div> 
  23. <input type="button" value="Submit" onclick="submitEmployee();" /> 
  24. </form> 
  25. </body> 
  26. </html> 

在奠基“Submit”按鈕之后,會(huì)調(diào)用submitEmployee函數(shù),這個(gè)函數(shù)根據(jù)用戶(hù)的輸入構(gòu)造一個(gè)Employee對(duì)象,然后再使用。以上介紹ASP.NET的TypeConverter。

【編輯推薦】

  1. ASP.NET中的WebRequestExecutor
  2. IIS6的ASP.NET ISAPI請(qǐng)求處理過(guò)程
  3. ASP.NET中的備份
  4. 淺談ASP.NET ISAPI
  5. ASP.NET的IIS ISAPI extension
責(zé)任編輯:佚名 來(lái)源: IT168
相關(guān)推薦

2009-07-22 17:45:35

ASP.NET教程

2009-08-03 14:22:33

什么是ASP.NET

2009-07-28 17:17:19

ASP.NET概述

2009-07-27 12:22:03

ASP.NET和ASPASP.NET入門(mén)教程

2009-07-27 15:48:43

2009-07-29 11:19:03

JavaScriptASP.NET

2009-07-29 16:33:28

GreeterLogiASP.NET

2009-07-29 14:52:12

IScriptContASP.NET

2009-07-29 17:11:25

ASP.NET ISA

2009-08-10 13:32:15

ASP.NET TimASP.NET組件設(shè)計(jì)

2009-07-29 16:08:07

ASP和ASP.NET

2009-07-22 18:03:00

ASP.NET ASP

2009-07-29 17:29:46

ASP與ASP.NET

2011-09-22 10:58:56

ASP.NET

2009-07-29 10:19:48

Session StaASP.NET

2009-07-28 14:40:15

XML數(shù)據(jù)ASP.NET

2009-07-22 17:23:03

XmlDataSourASP.NET 2.0

2009-07-27 13:52:36

Panel控件ASP.NET

2009-07-27 15:34:11

MembershipASP.NET

2009-07-28 15:04:34

PHP ASP.NET
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产免费播放视频 | 国产精品色婷婷久久58 | 激情五月婷婷综合 | 在线亚洲免费 | 久久久久国产一区二区三区 | 国内av在线| 精品av | 国产成人在线观看免费 | 午夜一级做a爰片久久毛片 精品综合 | 一区二区免费 | 午夜免费视频 | 日韩免费一区 | 成人欧美一区二区三区在线观看 | 欧美视频在线看 | 视频一区在线播放 | 精品国产一区二区三区成人影院 | 久久精品免费观看 | 日韩av一区二区在线观看 | 亚洲97 | 欧美成人a∨高清免费观看 色999日韩 | 午夜精品一区二区三区在线视 | 精品国产91乱码一区二区三区 | 色黄视频在线 | 亚洲网站观看 | 男女啪啪网址 | 日日操夜夜操天天操 | 岛国毛片 | 久久国产区| 2021狠狠天天天 | 欧美日韩久 | 色婷婷国产精品 | 日本一区二区视频 | 国产成人在线一区 | 国产日韩一区二区三区 | 欧美一级在线 | 欧洲色| 亚洲成人精品国产 | 51ⅴ精品国产91久久久久久 | 日韩免费视频一区二区 | 日本精品免费在线观看 | 婷婷综合五月天 |