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" onclick="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>
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章