下面是我的控制器,它从sql db中读取数据,然后尝试将结果编码为JSON并将数据发送回我的gridview.js
public JsonResult writeRecord() //public string writeRecord() { Response.Write("Survey Completed!"); SqlConnection conn = DBTools.GetDBConnection("ApplicationServices2"); string sqlquery = "SELECT Q1, Q2, Q3, Q4, Improvements, Comments FROM myTable"; SqlDataAdapter cmd = new SqlDataAdapter(sqlquery, conn); DataSet myData = new DataSet(); cmd.Fill(myData, "myTable"); conn.Open(); conn.Close(); return Json(myData, JsonRequestBehavior.AllowGet); //return myData.GetXml(); }
这就是问题所在,使用上面的代码,我在执行gridview.js时得到了没有数据的gridview表,但是如果我直接访问控制器的方法是这样的
http://localhost:55099/GridView/writeRecord
我得到这个错误,
序列化类型为’System.Globalization.CultureInfo’的对象时,检测到循环引用。 说明: 执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中起源的更多信息。 异常详细信息: System.InvalidOperationException:在序列化类型为System.Globalization.CultureInfo的对象时检测到循环引用。
有人可以帮忙吗..
我使用以下工具对JSON进行序列化和反序列化:
http://james.newtonking.com/pages/json- net.aspx
它非常易于使用且非常轻巧。
序列化时,我们使用以下选项:
JsonConvert.SerializeObject(myObject, Formatting.Indented, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore })
它忽略循环引用。
来自newtonking的json.net也非常快。
其他选项是使用DTO,并通过Diver提到的Automapper映射它们。
编辑:我怀疑您的商店是错误的:
var store = Ext.create('Ext.data.JsonStore', { storeId: 'myData', reader: new Ext.data.JsonReader({ root: 'myTable', fields: [{ name: 'Q1', type: 'int' }, { name: 'Q2', type: 'int' }, { name: 'Q3', type: 'int' }, { name: 'Q4', type: 'int' }, { name: 'Q5', type: 'int' }, { name: 'Improvements', type: 'string' }, { name: 'Comments', type: 'string'}] }), proxy: { type: 'json', url: 'GridView/writeRecord' } });