今日早晨女朋友给我送了一桶银耳汤,幸福呀,昨日的问题也迎刃而解。
近日项目需要做一个页面的异步载入,以前没做过,遂习惯性到google寻找答案。 找到2个比较可行的解决方案。
ASP.NET 2.0 AJAX中Webservice调用方法示例
现存问题以及解决方案:在ASP.NET AJAX中从客户端向服务器端传送DataTable
但经过试用,都不能成功运行。以下为遇到的问题及解决方案。
1。运行时遇到VS的轻量级调试服务器崩溃
此原因是由于引入数据集转换不正确造成的。
错误代码:
<jsonSerialization maxJsonLength="500000">
<converters>
<add name="DataTableConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter, Microsoft.Web.Preview"/>
</converters>
</jsonSerialization>正确代码:
<jsonSerialization maxJsonLength="500000">
<converters>
<add name="DataTableConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter, Microsoft.Web.Preview"/>
<add name="DataRowConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataRowConverter, Microsoft.Web.Preview"/>
</converters>
</jsonSerialization>需要加入DataRowConverter的引用,因为转换DataTable的时候需要对DataRow的转换
2。提示找不到Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter
需要下载ASP.NET 2.0 AJAX Futures January CTP,安装,并在项目中引用Microsoft.Web.Preview.dll,以获取数据转换方法
3。转换后的客户端DataTable的使用处理方式类同于C#中对DataTable的处理方式,使用result.rows.length获取RowNum,使用result.rows[i]["Id"]获取字段信息。

function pageLoad()...{
WS1.GetDataTable(SetResult);
}

function SetResult(result)...{
var contentBuilder = new Sys.StringBuilder();
for (var i = 0; i < result.rows.length; ++i)
...{
contentBuilder.append("<strong>Id</strong>: ");
contentBuilder.append(result.rows[i]["Id"]);
contentBuilder.append("<strong>Name</strong>: ");
contentBuilder.append(result.rows[i]["Name"]);
contentBuilder.append("<br />");
}
$get("result").innerHTML = contentBuilder.toString();
}
主要就是以上问题,下面是详细代码,仅供参考
Default.aspxWS1.asmx
<html>
<head runat="server">
<title>Untitled Page</title>
<script language="javascript" type="text/javascript">...
function pageLoad()...{
WS1.GetDataTable(SetResult);
}

function SetResult(result)...{
var contentBuilder = new Sys.StringBuilder();
for (var i = 0; i < result.rows.length; ++i)
...{
contentBuilder.append("<strong>Id</strong>: ");
contentBuilder.append(result.rows[i]["Id"]);
contentBuilder.append("<strong>Name</strong>: ");
contentBuilder.append(result.rows[i]["Name"]);
contentBuilder.append("<br />");
}
$get("result").innerHTML = contentBuilder.toString();
}
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="WS1.asmx" />
</Services>
</asp:ScriptManager>
<div id="result">Loading...</div>
</form>
</body>
</html>
using System;
using System.Web;
using System.Web.Services;
using System.Xml;
using System.Web.Services.Protocols;
using System.Web.Script.Services;
using System.Data;

/**//// <summary>
/// WS1 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class WS1 : System.Web.Services.WebService
...{

public WS1 () ...{
//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
[WebMethod]
[ScriptMethod]
public DataTable GetDataTable()
...{
DataTable myDataTable = new DataTable("haha");
myDataTable.Columns.Add(new DataColumn("Id", typeof(int)));
myDataTable.Columns.Add(new DataColumn("Name", typeof(string)));
for (int i = 0; i < 10; ++i)
...{
DataRow newRow = myDataTable.NewRow();
newRow["Id"] = i;
newRow["Name"] = string.Format("Name {0}", i);
myDataTable.Rows.Add(newRow);
}
return myDataTable;
}
}
