ASP.NET Web API:JSON序列化循环引用

ASP.NET Web API:JSON序列化循环引用,asp.net,json.net,entity-framework-6,asp.net-web-api2,json-serialization,Asp.net,Json.net,Entity Framework 6,Asp.net Web Api2,Json Serialization,我正在通过ASP.NET Web API检索JSON对象图。我正在尝试从子实体访问属性。但是,当查看浏览器的控制台时,它会显示对象的引用($ref),而不是序列化该对象的属性。如何访问这些属性 角度JS视图 字段1 字段2 字段3 字段4 字段5 {{item.CompanyDomainModel.CompanyName} {{item.RatingDomainModel.RatingValue} {{item.Views} {{item.Clicks} {{item.EmailSent} {

我正在通过ASP.NET Web API检索JSON对象图。我正在尝试从子实体访问属性。但是,当查看浏览器的控制台时,它会显示对象的引用(
$ref
),而不是序列化该对象的属性。如何访问这些属性

角度JS视图


字段1
字段2
字段3
字段4
字段5
{{item.CompanyDomainModel.CompanyName}
{{item.RatingDomainModel.RatingValue}
{{item.Views}
{{item.Clicks}
{{item.EmailSent}
{{tF.status}
服务

public ICollection GetRecordsByPageSize(int页){
常数int pgeSize=20;
var结果=_companystatepo
.all包括(c=>c.CompanyDomainModel,c=>c.RatingDomainModel)
.OrderBy(c=>c.CompanyStatId)
.Skip(第*pgeSize页)
.Take(pgeSize)
.ToList();
返回结果;
} 
终点

IHttpActionResult GetRecordsByPageSize(int页){
var companyStatService=new companyStatService();
返回Ok(companyStatService.GetRecordsByPageSize(第页));
} 
评级域模型

公共类分级域模型:IObjectWithState
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[数据成员]
公共整数比率ID{get;set;}
[数据成员]
public int CompanyId{get;set;}
[数据成员]
public int UserId{get;set;}
[数据成员]
公共整型值{get;set;}
[数据成员]
公共日期时间CreatedDate{get;set;}
//[外键(“用户ID”)]
[数据成员]
公共虚拟UserDomainModel UserDomainModel{get;set;}
//[外键(“公司ID”)]
[数据成员]
公共虚拟公司域模型公司域模型{get;set;}
[数据成员]
公共虚拟ICollection CompanyStatDomainModels{get;set;}
[未映射]
public Common.DataObject.State状态{get;set;}
[未映射]
公共图书馆
{
获取{返回this.RatingId!=default(int);}
}
公共对象PersistenceEntityId
{
获取{返回this.RatingId;}
}
}
输出


在WebApiConfig.cs中添加了以下代码

config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling =    Newtonsoft.Json.ReferenceLoopHandling.Ignore;
config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;

注意:我不认为AngularJS代码或标记在这里有多大价值。这确实是一个关于ASP.NET Web API的问题,并且与您的客户端代码是用什么编写的无关。另外,您是否已经在API和客户端上投入了大量资金?如果不是,您可能需要考虑制作ODATA控制器。OData通过允许使用一致的查询字符串参数定义投影,优雅地解决了这个问题。例如,在这种情况下,您可以使用
?$expand=RatingDomainModel
。这是一个相当大的架构转变,但是如果你在项目早期,它可能会提供额外的好处。另外,你能从你的控制器发布这个特定端点的代码吗?了解您当前如何公开这些对象将非常有用。我在API上投入了大量资金。下面的代码是我的服务公共ICollection GetRecordsByPageSize(int page){const int pgeSize=20;var result=_companyStatRepo.AllIncluding(c=>c.CompanyDomainModel,c=>c.RatingDomainModel)。OrderBy(c=>c.CompanyStatId).Skip(page*pgeSize).Take(pgeSize).ToList();返回结果;}@杰里米·卡尼:在未来,也许最好提到你从评论中获得了额外的代码,否则在评论员看来,它就像你刚刚编造的一样。这帮了我大忙!我几乎要放弃了,开始撕碎我的整个数据模型。谢谢