ASP.NET的TypeConverter
创始人
2024-04-20 22:31:08
0

TypeConverter对于编写ASP.NET Server Control的朋友可谓是再熟悉不过了。我们通过示例,一步一步地来查看如何在Atlas中使用自定义TypeConverter。

JavaScriptConverter类的作用是提供了开发人员自定义序列化与反序列化的能力,这一点对于操作含有循环引用的复杂对象尤其重要。这个类在RTM Release中的功能被精简了。它的方法和属性被缩减成了三个:

1. IEnumerable SupportedTypes:只读属性,返回这个Converter所有能够支持的类。

2. object Deserialize(IDictionary 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 Serialize(object obj, JavaScriptSerializer serializer):这个方法的作用相对纯粹一些,将obj对象转换为一个IDictionary对象,在这个方法将结果返回后,ASP.NET AJAX会在这个Dictionary中添加“__type”的值,这样的话,在反序列化时也能够使用当前的JavaScriptConverter来进行相反的操作。

首先,定义一个复杂类型Employee:

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

可以看到,我们使用了TypeConverterAttribute将稍后会讲解的EmployeeConverter关联到Employee上。

接着,和上一个例子一样,我们写一个支持HTTP GET访问的Web Services方法,只是参数使用了复杂类型。

  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. " type=\"text/xsl\" href=\"Employee.xsl\"?>" +  
  12. "");  
  13. responseDoc.SelectSingleNode("//Name").InnerText = employee.Name;  
  14. responseDoc.SelectSingleNode("//Age").InnerText = employee.Age.ToString();  
  15. return responseDoc;  
  16. }  

然后是所需的Xslt文件:

  1.  version="1.0" encoding="utf-8"?> 
  2.  version="1.0" 
  3. xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
  4.  match="/Employee"> 
  5.  
  6.  
  7. </FONT></STRONG>Thanks for your participation<STRONG><FONT color=#006699> 
  8.  
  9.  style="font-family:Verdana; font-size:13px;"> 
  10. Here's the employee you submitted:

     
  11.  
  12. Name:  
  13.  select="Name" /> 
 
  •  
  • Age:  
  •  select="Age" /> 
  •  
  •  
  •  
  •  
  •   
  • 上面这些对于看过之前一片文章的朋友们来说应该很熟悉。接下来,我们就进入正题,定义一个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, 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.  xmlns="http://www.w3.org/1999/xhtml" > 
    2.  
    3. </FONT></STRONG>Convert Primitive Object using Customized TypeConverter<STRONG><FONT color=#006699> 
    4.  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.  
    16.  
    17.  style="font-family:Verdana; font-size:13px;"> 
    18.  runat="server"> 
    19.  ID="ScriptManager1" runat="server" /> 
    20.  
    21. Name: type="text" id="txtName" />
       
    22. Age: type="text" id="txtAge" />
       
    23.  type="button" value="Submit" onclick="submitEmployee();" /> 
    24.  
    25.  
    26.  

    在奠基“Submit”按钮之后,会调用submitEmployee函数,这个函数根据用户的输入构造一个Employee对象,然后再使用。以上介绍ASP.NET的TypeConverter。

    【编辑推荐】

    1. ASP.NET中的WebRequestExecutor
    2. IIS6的ASP.NET ISAPI请求处理过程
    3. ASP.NET中的备份
    4. 浅谈ASP.NET ISAPI
    5. ASP.NET的IIS ISAPI extension

    相关内容

    热门资讯

    如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
    如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
    施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
    20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
    Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
    德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
    为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
    《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...