先说下开发环境,不一样的没法解决,再看看其他的解决方案吧:.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”的对象时检测到循环引用报错的问题。