gpt4 book ai didi

asp.net-mvc - 使用 ASP.NET MVC 中的内置 JsonResult 对 NHibernate 实体进行 JSON 序列化会产生循环依赖错误

转载 作者:行者123 更新时间:2023-12-04 20:02:34 38 4
gpt4 key购买 nike

我正在尝试通过 ASP.NET MVC 前端层从我的服务器返回一个 JSON 列表:

var stuff = repo.GetStuff();
return Json(stuff);

但是,我收到一条错误消息,而不是预期的 JSON

A circular reference was detected while serializing an object of type 'System.Reflection.RuntimeModule'.



我想我已经找到了发生这种情况的地方,但是为了解释它,我需要一个简单的示例域模型,如下所示:

enter image description here

我正在(懒惰地?)从 NHibernate 加载一系列文档,如下所示:
var session = getNHibernateSession();
var query = new NhQueryable<Document>(session.GetSessionImplementation());
var docs = query.ToList().AsEnumerable();

然后我通过文件返回 JsonResult在我的 Controller 中:
return Json(docs, JsonRequestBehavior.AllowGet);

现在,当 Json()对集合进行序列化,它遍历文档的属性,找到一个人。它序列化那个人,并找到一个项目。它对项目进行序列化,并再次找到 - 没错 - 那个人!由于我是延迟加载,因此如果没有任何东西阻止它,它可以一直走下去,但它会因循环引用错误而停止。

我真的不需要降低所有这些级别(如果不首先加载项目我会很好) - 我能以某种方式影响 Json()序列化这个集合,不要走得更远,比如说,下降 2 个级别?我搜索了一下,但我发现的大部分内容似乎来自那些决定直接使用序列化库的人,而不仅仅是使用 .NET MVC 中的内置功能。 (注意:这个问题的解决方案必须可以专门应用于这种情况,因为我可能想要在应用程序的其他地方获取人员的 JSON 列表,包括项目......)

最佳答案

如果您正在检索 Json,则您有一个服务 api。除了实现之外,您还必须设计 api。将使用它的页面是否需要所有这些字段和集合?可能不是。为其他功能和服务添加更多属性怎么样?它们将开始出现在所有请求中。

您需要使用 ViewModel 或仅使用具有所需结构的匿名类型:

var session = getNHibernateSession();
var query = new NhQueryable<Document>(session.GetSessionImplementation());
var docs = query.ToList();
var result = query.Select(x => new {
x.Id,
x.Name,
People = new { p.Id,
p.Name,
p.Title
}
});

return Json( result, JsonRequestBehavior.AllowGet);

通过这种方式,您可以控制渲染的内容和方式。

关于asp.net-mvc - 使用 ASP.NET MVC 中的内置 JsonResult 对 NHibernate 实体进行 JSON 序列化会产生循环依赖错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11121144/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com