中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ASP.NET中TypeConverter的作用是什么

發布時間:2021-07-15 15:11:45 來源:億速云 閱讀:166 作者:Leah 欄目:編程語言

ASP.NET中TypeConverter的作用是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

JavaScriptConverter類的作用是提供了開發人員自定義序列化與反序列化的能力,這一點對于操作含有循環引用的復雜對象尤其重要。這個類在RTM Release中的功能被精簡了。它的方法和屬性被縮減成了三個:

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

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

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

第二個參數為轉換的目標類型。而第三個參數,則是調用當前Deserialize方法的JavaScriptSerializer了,我們的一些反序列化操作可以委托給它執行,它已經關聯好了web.config中配置的JavaScriptConverter。不過需要注意的就是,千萬要避免下一步操作又沒有改變地回到了當前的Deserialize方法,顯然這樣會出現死循環。

3. IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer):這個方法的作用相對純粹一些,將obj對象轉換為一個IDictionary<string, object>對象,在這個方法將結果返回后,ASP.NET AJAX會在這個Dictionary中添加“__type”的值,這樣的話,在反序列化時也能夠使用當前的JavaScriptConverter來進行相反的操作。

首先,定義一個復雜類型Employee:

[TypeConverter(typeof(EmployeeConverter))]  public class Employee  {  public string Name;  public int Age;  }

可以看到,我們使用了TypeConverterAttribute將稍后會講解的EmployeeConverter關聯到Employee上。

接著,和上一個例子一樣,我們寫一個支持HTTP GET訪問的Web Services方法,只是參數使用了復雜類型。

[WebService(Namespace = "http://tempuri.org/")]  [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]  public class HttpGetEmployeeService  : System.Web.Services.WebService {   [WebMethod]  [WebOperation(true, ResponseFormatMode.Xml)]  public XmlDocument SubmitEmployee(Employee employee)  {  XmlDocument responseDoc = new XmlDocument();  responseDoc.LoadXml(  "<?xml-stylesheet type=\"text/xsl\" href=\"Employee.xsl\"?>" +  "<Employee><Name></Name><Age></Age></Employee>");  responseDoc.SelectSingleNode("//Name").InnerText = employee.Name;  responseDoc.SelectSingleNode("//Age").InnerText = employee.Age.ToString();  return responseDoc;  }  }

然后是所需的Xslt文件:

<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/Employee"> <html> <head> <title>Thanks for your participation</title> </head> <body style="font-family:Verdana; font-size:13px;"> <h5>Here's the employee you submitted:</h5> <div> <xsl:text>Name: </xsl:text> <xsl:value-of select="Name" /> </div> <div> <xsl:text>Age: </xsl:text> <xsl:value-of select="Age" /> </div> </body> </html> </xsl:template> </xsl:stylesheet>

上面這些對于看過之前一片文章的朋友們來說應該很熟悉。接下來,我們就進入正題,定義一個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可以將一個String轉換成另一個對象。接著在覆蓋 ConvertFrom方法,將傳入的value值轉換為一個復雜對象Employee。這里為了方便,我們把Employee對象在客戶端JOSN序列化,然后在服務器端再序列化回來,事實上,這種基礎類型到復雜類型的轉換,完全可以使用任何方式。

代碼都非常簡單,也容易理解,因此我們直接看一下使用代碼。由于代碼很少,就將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> 

看完上述內容,你們掌握ASP.NET中TypeConverter的作用是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

威信县| 法库县| 凌海市| 夏河县| 东安县| 东源县| 奉新县| 建阳市| 天镇县| 昌黎县| 新兴县| 克东县| 德江县| 信丰县| 萨迦县| 望都县| 崇州市| 疏勒县| 公安县| 丰都县| 日喀则市| 大邑县| 平山县| 滨州市| 资源县| 彝良县| 大荔县| 色达县| 班戈县| 武穴市| 开封市| 阿尔山市| 庄河市| 广河县| 蓬安县| 阳新县| 宁晋县| 白朗县| 武义县| 大荔县| 奉新县|