在服务器端定义的一些方法,只要加上ajax库的某个属性,则可在client-side中直接进行调用,如果服务器端方法有返回值的话,在客户端还能接收并像使用服务器端对象一般,我之前一直很疑惑,为什么能做到如此,当时看到在服务器端返回一个datatable对象,然后就看到在客户端使用这个datatable对象了,使用的代码和方式就像再写服务器端代码一样,当时很是疑惑,因为自己刚接触web不久,最终没能正面的帮客户解决使用中的一个问题,而是提供了另一种比较笨的方式callback。后来有幸看到一篇介绍JSON的文章,渐渐的思路有点清晰起来,猜想应该是在服务器端将某个对象序列化成JSON,然后在客户端再将JSON实例化成某个对象,为了印证我的思路,google上一搜,果然已经有了很多将对象序列化成JSON的代码,附上codeproject上的一个实现:
还有人专门从Anthem.net中专门剥离出了这部分代码,这里也一并附上:
public class Converter
{
private static void WriteDataRow(StringBuilder sb, DataRow row)
{
sb.Append("{");
foreach (DataColumn column in row.Table.Columns)
{
sb.AppendFormat("\"{0}\":", column.ColumnName);
WriteValue(sb, row[column]);
sb.Append(",");
}
// Remove the trailing comma.
if (row.Table.Columns.Count > 0)
{
--sb.Length;
}
sb.Append("}");
}
private static void WriteDataSet(StringBuilder sb, DataSet ds)
{
sb.Append("{\"Tables\":{");
foreach (DataTable table in ds.Tables)
{
sb.AppendFormat("\"{0}\":", table.TableName);
WriteDataTable(sb, table);
sb.Append(",");
}
// Remove the trailing comma.
if (ds.Tables.Count > 0)
{
--sb.Length;
}
sb.Append("}}");
}
private static void WriteDataTable(StringBuilder sb, DataTable table)
{
sb.Append("{\"Rows\":[");
foreach (DataRow row in table.Rows)
{
WriteDataRow(sb, row);
sb.Append(",");
}
// Remove the trailing comma.
if (table.Rows.Count > 0)
{
--sb.Length;
}
sb.Append("]}");
}
private static void WriteEnumerable(StringBuilder sb, IEnumerable e)
{
bool hasItems = false;
sb.Append("[");
foreach (object val in e)
{
WriteValue(sb, val);
sb.Append(",");
hasItems = true;
}
// Remove the trailing comma.
if (hasItems)
{
--sb.Length;
}
sb.Append("]");
}
private static void WriteHashtable(StringBuilder sb, Hashtable e)
{
bool hasItems = false;
sb.Append("{");
foreach (string key in e.Keys)
{
sb.AppendFormat("\"{0}\":", key.ToLower());
WriteValue(sb, e[key]);
sb.Append(",");
hasItems = true;
}
// Remove the trailing comma.
if (hasItems)
{
--sb.Length;
}
sb.Append("}");
}
private static void WriteObject(StringBuilder sb, object o)
{
MemberInfo[] members = o.GetType().GetMembers(BindingFlags.Instance | BindingFlags.Public);
sb.Append("{");
bool hasMembers = false;
foreach (MemberInfo member in members)
{
bool hasValue = false;
object val = null;
if ((member.MemberType & MemberTypes.Field) == MemberTypes.Field)
{
FieldInfo field = (FieldInfo)member;
val = field.GetValue(o);
hasValue = true;
}
else if ((member.MemberType & MemberTypes.Property) == MemberTypes.Property)
{
PropertyInfo property = (PropertyInfo)member;
if (property.CanRead && property.GetIndexParameters().Length == 0)
{
val = property.GetValue(o, null);
hasValue = true;
}
}
责任编辑:小草