Asp.net AJAX 返回从服务器端返回DataTable

 
 

在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<stringobject> dictionary, Type type, JavaScriptSerializer serializer)
        
{
            
throw new NotImplementedException("Deserialize is not implemented.");
        }


        
public override IDictionary<stringobject> Serialize(object obj, JavaScriptSerializer serializer)
        
{
            DataTable dt 
= obj as DataTable;
            Dictionary
<stringobject> result = new Dictionary<stringobject>();

            
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<stringobject> colValues = new Dictionary<stringobject>();

                    
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);
    }

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

我都愁死了,

posted on 2008-05-14 18:10 GodSpeed 阅读(1379) 评论(4)  编辑 收藏

评论

#1楼  2008-05-14 21:57 求知无傲      

很奇怪,用了AJAX,本地测试好好的,发布倒网络上就出问题了。   回复  引用  查看    

#2楼  2008-05-15 01:05 DreamingEric [未注册用户]

可能是服务器的ajax版本不一样   回复  引用    

#3楼  2008-05-15 09:09 大力      

@求知无傲
看一下你的BIN里有没有System.Web.Extensions.Design.dll和System.Web.Extensions.dll,服务器是不要装AJAX的。   回复  引用  查看    

#4楼  2008-06-16 19:04 Xuemin_Zhang      

我反汇编了Prieview.dll,用其中的代码写了DataTableConverter.但调试时出现死循环,不知道什么情况?
以下是代码:
public class DataTableConverter1:JavaScriptConverter
{
protected virtual string GetClientTypeNameForType(Type type)
{
if (typeof(string).IsAssignableFrom(type) || typeof(char).IsAssignableFrom(type))
{
return "String";
}
if (typeof(bool).IsAssignableFrom(type))
{
return "Boolean";
}
if (typeof(DateTime).IsAssignableFrom(type))
{
return "Date";
}
if (((!typeof(int).IsAssignableFrom(type) && !typeof(double).IsAssignableFrom(type)) && (!typeof(float).IsAssignableFrom(type) && !typeof(long).IsAssignableFrom(type))) && (((!typeof(short).IsAssignableFrom(type) && !typeof(byte).IsAssignableFrom(type)) && (!typeof(uint).IsAssignableFrom(type) && !typeof(ulong).IsAssignableFrom(type))) && (!typeof(ushort).IsAssignableFrom(type) && !typeof(sbyte).IsAssignableFrom(type))))
{
return "Object";
}
return "Number";
}


protected virtual IDictionary<string, object> SerializeDataColumn(DataColumn column, bool isPrimaryKeyColumn, JavaScriptSerializer serializer)
{
IDictionary<string, object> dictionary = new Dictionary<string, object>(5);
dictionary["name"] = column.ColumnName;
dictionary["dataType"] = this.GetClientTypeNameForType(column.DataType);
dictionary["defaultValue"] = (column.DefaultValue == DBNull.Value) ? null : column.DefaultValue;
dictionary["readOnly"] = column.ReadOnly;
dictionary["isKey"] = isPrimaryKeyColumn;
return dictionary;
}
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
throw new NotImplementedException();
}

public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
DataTable dt = obj as DataTable;
if (dt != null)
{
IDictionary<string, object> dictionary = new Dictionary<string, object>(2);
//行值列表
if (dt.Columns.Count > 0)
{
IDictionary<string, object>[] dictionaryArray = new Dictionary<string, object>[dt.Columns.Count];
DataColumn[] primaryKey = dt.PrimaryKey;
int index = 0;
//用这个Dictionary存列名和列值
foreach (DataColumn column in primaryKey)
{
dictionaryArray[index] = this.SerializeDataColumn(column, true, serializer);
index++;
}
for (int i = 0; index < dictionaryArray.Length; i++)
{
DataColumn column2 = dt.Columns[i];
if (Array.IndexOf<DataColumn>(primaryKey, column2) == -1)
{
dictionaryArray[index] = this.SerializeDataColumn(column2, false, serializer);
index++;
}
}
dictionary["columns"] = dictionaryArray;
}
else
{
dictionary["columns"] = null;
}
if (dt.Rows.Count > 0)
{
DataRow[] rowArray = new DataRow[dt.Rows.Count];
for (int j = 0; j < rowArray.Length; j++)
{
rowArray[j] = dt.Rows[j];
}
dictionary["rows"] = rowArray;
return dictionary;
}
dictionary["rows"] = null;
return dictionary;
}
return new Dictionary<string, object>();
}

/// <summary>
/// 把DataTable定义成支持的类型
/// </summary>
public override IEnumerable<Type> SupportedTypes
{
get
{
return new ReadOnlyCollection<Type>(new Type[] { typeof(DataTable) });
}
}
}
以下是使用的代码:
[WebMethod]
[ScriptMethod]
public string ReturnDataTable()
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("Name", typeof(string)));
dt.Columns.Add(new DataColumn("Sex", typeof(string)));
dt.Columns.Add(new DataColumn("Salary", typeof(string)));

DataRow drNew = dt.NewRow();
drNew["Name"] = "Rose Zhao";
drNew["Sex"] = "Female";
drNew["Salary"] = "2000";
dt.Rows.Add(drNew);

drNew = dt.NewRow();
drNew["Name"] = "King Zheng";
drNew["Sex"] = "male";
drNew["Salary"] = "3000";
dt.Rows.Add(drNew);

JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new JavaScriptConverter[] { new Nimeux.DataConverter.DataTableConverter1() });

string temp = serializer.Serialize(dt);
return temp;
}   回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
另存  打印
 


<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

导航

统计

与我联系

常用链接

留言簿

我参加的小组

我参与的团队

我的标签

随笔档案(36)

搜索

最新评论

阅读排行榜

评论排行榜