标题: Asp.net AJAX 返回从服务器端返回DataTable
- GodSpeed 2008-05-14 18:10 阅读:1439
- 评论:4 查看评论 | 添加评论
 
 

在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一样用它,当然,也有可能是我用的有问题,大家给我点儿建议啊) 我的回调函数如下:

 


    function onSuccess(result)
    {

    alert(result.rows[i].key);
    }

如果第二种方法不行,就只有用第一种了。

我都愁死了,


查看评论 | 添加评论
返回顶部 | 返回首页