先说下开发环境,不一样的没法解决,再看看其他的解决方案吧:.Net Frameword 4.5 + MVC5
实际应用是这样的,我调用存储过程,返回了DataTable,我不想转Model之类的,想直接DataTable返回Json对象,代码如下:
[AllowAnonymous]
public ActionResult Page()
{
Dictionary<string, object> result = new Dictionary<string, object>();
result.Add("code", 200);
PurchaseDao dao = new PurchaseDao();
string goods = "db";
string produce = "";
string spec = "";
string xml = "<r Goods=\"" + goods + "\" Produce=\"" + produce + "\" Spec=\"" + spec + "\"/>";
DataTable table = dao.Purchase_Get_Goods(xml, 1, 20);
CPager page = dao.Pager;
Dictionary<string, object> data = new Dictionary<string, object>();
data.Add("page", 1);
data.Add("records", table.Rows.Count);
data.Add("total", page.TotalPages);
data.Add("rows", table);
result.Add("data", data);
result.Add("info", "相应成功!");
return Json(result, JsonRequestBehavior.AllowGet);
}直接报错:序列化类型为“System.Reflection.RuntimeModule”的对象时检测到循环引用
首先,查了网上的方案。
方案1:
JsonSerializerSettings setting = new JsonSerializerSettings()
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};
var ret = JsonConvert.SerializeObject(data, setting);
return Json(ret, JsonRequestBehavior.AllowGet);这样处理,是不报错了,但是,它给我返回了字符串了,而不是json对象,因为我前端是给表格取值,不是直接ajax请求的,所以要处理的话还得修改表格控件,太麻烦了。
方案2:
web.config文件下加入如下代码,可能是我加的方式不对,无效。
<!--解决ajax返回datatable问题--> <system.web.extensions> <scripting> <webServices> <jsonSerialization> <converters> <add name="DataSetConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataSetConverter" /> <add name="DataRowConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataRowConverter" /> <add name="DataTableConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter" /> </converters> </jsonSerialization> </webServices> </scripting> </system.web.extensions>
最后,我是这样解决的,新增方法,DataTable转List
public List<Dictionary<string, object>> SerializeDataTable(DataTable dt)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
foreach (DataRow dr in dt.Rows)//每一行信息,新建一个Dictionary<string,object>,将该行的每列信息加入到字典
{
Dictionary<string, object> result = new Dictionary<string, object>();
foreach (DataColumn dc in dt.Columns)
{
result.Add(dc.ColumnName, dr[dc].ToString());
}
list.Add(result);
}
return list;//调用Serializer方法
}然后,
data.Add("rows", SerializeDataTable(table));通过这样的方法,解决了序列化类型为“System.Reflection.RuntimeModule”的对象时检测到循环引用报错的问题。
编程那点事
