0

我在控制器中有这段代码

[HttpPost]
public ActionResult Index([DataSourceRequest]DataSourceRequest request)
{
    var tickets = db.Tickets.Include(t => t.AreaOfBusiness).Include(t => t.Assignee).Include(t => t.Severity).Include(t => t.TicketStatu);
    return this.Json(tickets.ToDataSourceResult(request));
}

但我明白了

序列化“System.Data.Entity.DynamicProxies.Ticket_2B104FE45830306408DA130C08090F61ADA6B8A0106592FECE85087B94B”类型的对象时检测到循环引用

启动 KendoGrid 时。

我读到 NewtonSoft Json.Net 可以处理循环引用。我无法理解如何使用它。

你能帮我修改代码以使用 Json.Net 吗?

提前谢谢!

4

2 回答 2

1

ToDataSourceResult返回对象DataSourceResult

剑道文档

序列化类型对象时检测到循环引用

这个错误的原因是Json方法使用的JavaScriptSerializer类无法序列化包含循环引用(互相引用)的对象图。最好的解决方案是使用 View Model 对象并避免序列化创建循环引用的属性。查看“如何避免循环引用异常”常见问题解答部分以获取更多信息。

见文档

“如何避免循环引用异常?”

如果序列化对象包含循环引用,JavaScriptSerializer 类将抛出异常。为避免这种情况,请使用视图模型并排除创建循环引用的属性

看例子

更多数据

于 2013-01-03T00:11:11.170 回答
1

或者...您可以启用 json.net 功能来序列化处理对象的循环引用

在你的global.asax.cs

System.Net.Http.Formatting.JsonMediaTypeFormatter jsonMediaTypeFormatter = GlobalConfiguration.Configuration.Formatters.OfType<System.Net.Http.Formatting.JsonMediaTypeFormatter>().FirstOrDefault();
jsonMediaTypeFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize;
jsonMediaTypeFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;

请记住禁用延迟加载,否则它将下载整个数据库,在 dbsets 上使用 include 来保持您想要的关系并解析现在表现得像字典一样的 json,例如:https ://gist.github.com/keesey /7995398

于 2014-04-13T15:47:46.990 回答