怎么样在客户端使用服务器端的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>
首先,需要说明的是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>