|
在CTP版中,只要在web config中配置如下即可:
[图片]<jsonSerialization maxJsonLength="500">
[图片] <converters> [图片] [图片] <add name="DataSetConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataSetConverter, Microsoft.Web.Preview, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> [图片] <add name="DataRowConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataRowConverter, Microsoft.Web.Preview, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> [图片] <add name="DataTableConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter, Microsoft.Web.Preview, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> [图片] </converters> [图片] </jsonSerialization>
在server端直接调用个返回DataTable的方法就可以了,多简单啊 感动的都哭了。 下载并安装了正式版后,有炸了微软大楼的冲动.正式版中竟然把这三个Converter给干掉了,取而代之的是一个抽象类JavaScriptConverter,让我们自己去写Converter,想想我就怒从心头起,恶向胆边生,我()*&^*&&%(*&....省略两万字. 伤心归伤心,工作还得做啊 怎么办呢 想了几个解决办法. 第一种,最简单的。直接把CTP版中的那个dll引用上来,那么一切就象以前一样,又恢复平静了.... 第二种,自己写一个DataTableConverter类.这里我在一个老外的网站上发现了一个,不过写的可能有点儿问题.调用后返回到页面中后就不知道该怎么用了。
[图片][图片]/**//// <summary>
[图片] /// DataTableConverter 的摘要说明 [图片] /// </summary> [图片][图片] /**//**/ [图片][图片] /**//// <summary> [图片] /// DataTable to JSON converter [图片] /// </summary> [图片] public class DataTableConverter : JavaScriptConverter [图片][图片] [图片]{ [图片] public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) [图片][图片] [图片]{ [图片] throw new NotImplementedException("Deserialize is not implemented."); [图片] } [图片] [图片] public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) [图片][图片] [图片]{ [图片] DataTable dt = obj as DataTable; [图片] Dictionary<string, object> result = new Dictionary<string, object>(); [图片] [图片] if (dt != null && dt.Rows.Count > 0) [图片][图片] [图片]{ [图片] // List for row values [图片] //行值列表 [图片] List<object> rowValues = new List<object>(); [图片] [图片] foreach (DataRow dr in dt.Rows) [图片][图片] [图片]{ [图片] // Dictionary for col name / col value [图片] //用这个Dictionary存列名和列值 [图片] Dictionary<string, object> colValues = new Dictionary<string, object>(); [图片] [图片] foreach (DataColumn dc in dt.Columns) [图片][图片] [图片]{ [图片] colValues.Add(dc.ColumnName, // col name 列名 [图片] (string.Empty == dr[dc].ToString()) ? null : dr[dc]); // col value 列值 [图片] } [图片] [图片] // Add values to row [图片] //把值添加到行 [图片] rowValues.Add(colValues); [图片] } [图片] [图片] // Add rows to serialized object [图片] //把序列化的对象添加到行中 [图片] result["rows"] = rowValues; [图片] } [图片] [图片] return result; [图片] } [图片] [图片] public override IEnumerable<Type> SupportedTypes [图片][图片] [图片]{ [图片] //Define the DataTable as a supported type. [图片] //把DataTable定义成支持的类型 [图片] get [图片][图片] [图片]{ [图片] return new System.Collections.ObjectModel.ReadOnlyCollection<Type>( [图片] new List<Type>( [图片][图片] new Type[] [图片]{ typeof(DataTable) } [图片] ) [图片] ); [图片] } [图片] } [图片] } [图片]
调用时的C#方法:
[图片] [WebMethod]
[图片] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] [图片] public DataTable GetTable() [图片][图片] [图片]{ [图片] DataTable dt = new DataTable("testTable"); [图片] [图片] dt.Columns.Add(new DataColumn("key", typeof(int))); [图片] dt.Columns.Add(new DataColumn("value", typeof(string))); [图片] [图片] for (int i = 0; i < 5; i++) [图片][图片] [图片]{ [图片] DataRow newRow = dt.NewRow(); [图片] newRow["key"] = i; [图片] newRow["value"] = string.Format("name {0}", i); [图片] [图片] dt.Rows.Add(newRow); [图片] } [图片] [图片] JavaScriptSerializer toJSON = new JavaScriptSerializer(); [图片][图片] toJSON.RegisterConverters(new JavaScriptConverter[] [图片]{ new DataTableConverter() }); [图片] [图片] return toJSON.Serialize(dt); [图片] } [图片]
前台返回的值是个看起来想json的东西(之所以说它象,是因为我没有办法象json一样用它,当然,也有可能是我用的有问题,大家给我点儿建议啊) 我的回调函数如下:
alert(result.rows[i].key); 如果第二种方法不行,就只有用第一种了。 我都愁死了, |