asp.net ajax框架使用-DataTable的使用

怎么样在客户端使用服务器端的DataTable。在尝试使用从服务器端返回的一个DataTable时,总会有一个异常抛出,今天找到原因了。

     首先,需要说明的是asp.net ajax框架使用JSON来传递信息。JSON是基于Javascript的一种轻量级的信息传递方式,其可以表示的信息格式是有限的。JSON可以表示类似于字典和数组的信息格式。当我们使用一个比较简单的对象时,利用JSON可以表示;但在使用一些复杂对象时,如DataTable,JSON并不能表示DataTable对象的所包含信息结构(DataTable并不能序列化为JSON的表现形式),所以会有异常抛出。

     怎么样来解决这个问题呢?

    第一种解决方案:使用Microsoft.Web.Preview.dll所提供的JS转换器功能。
                                  ( 该dll是ASP.NET Futures July 2007安装后产生的)

     在使用ASP.NET Futures July 2007时,需要在web.config中进行一些配置:
    
     <!--自定义转换器声明,asp.net ajax所需要的配置-->
<system.web.extensions>
     <scripting>
       <webServices>
         <!--<jsonSerialization maxJsonLength="500">-->
         <jsonSerialization>
           <converters>
             <add name="DataSetConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataSetConverter, Microsoft.Web.Preview, Version=1.2.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
             <add name="DataRowConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataRowConverter, Microsoft.Web.Preview, Version=1.2.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
             <add name="DataTableConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter, Microsoft.Web.Preview, Version=1.2.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
           </converters>
         </jsonSerialization>
       </webServices>
     </scripting>
</system.web.extensions>

     以上配置信息直接位于根节点,表示为DataTable、DataSet与DataRow指定一个转换器,这样在DataTable、DataSet与DataRow返回到客户端时,会被转换为JSON可以识别将表示的信息格式。下面是一个示例!

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>

<%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
     Namespace="System.Web.UI" TagPrefix="asp" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
   
     [System.Web.Services.WebMethod]
     public static DataTable GetDataTable()
     {
         DataTable table = new DataTable();
         Random random = new Random(DateTime.Now.Millisecond);

         table.Columns.Add(new DataColumn("ID", typeof(int)));
         table.Columns.Add(new DataColumn("Text", typeof(string)));

         for (int i = 0; i < 10; i++)
         {
             table.Rows.Add(i, random.Next().ToString());
         }

         return table;
     }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
     <title>asp.net ajax使用DataTable</title>
</head>
<body>
     <form id="form1" runat="server">
     <div>
         <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
         </asp:ScriptManager>
         <input type="button" value="GetDataTable" οnclick="GetDataTable()" />
       
         <script language="javascript" type="text/javascript">
             PageMethods.set_timeout(5000);
             PageMethods.set_defaultFailedCallback(OnFailed);
           
             function GetDataTable()
             {
                PageMethods.GetDataTable(OnSucceed);
             }
           
             function OnSucceed(DataTable)
             {
                 var sb = new Sys.StringBuilder();
                 sb.append("<table border='1'><tr><td>ID</td><td>Text</td></tr>");
                 for ( var i = 0 ; i < DataTable.rows.length ; i ++ )
                 {
                     sb.append("<tr><td>" + DataTable.rows[i].ID + "</td><td>" + DataTable.rows[i].Text + "</td></tr>");
                 }
                 sb.append("</table>");
               
                 $get("content").innerHTML = sb.toString();
             }
           
             function OnFailed(ErrorHandling)
             {
                 var ErrorMessage = '是否超时'+ErrorHandling.get_timedOut()+'/n错误信息为:' + ErrorHandling.get_message();
                 ErrorMessage = ErrorMessage + '/n异常名称为:' + ErrorHandling.get_exceptionType() + '/n错误位置为:' + ErrorHandling.get_stackTrace();
                 alert(ErrorMessage);
             }
         </script>
     </div>
         <div id="content">
       
         </div>
     </form>
</body>
</html>
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值