【发布时间】:2016-12-04 16:00:40
【问题描述】:
我的 WebAPI 有一些问题。
我有以下型号。
模型A
Guid id;
String name;
Guid ModelBId;
virtual ModelB ModelB;
模型B
Guid id;
String name;
我正在创建一个包含 2 个 ModelA 实例的列表,每个实例都有一个名称并且对 modelB 具有相同的引用,例如:
obj1 = New ModelA("myName", "1edh-...");
obj2 = New ModelA("otherName", "1edh-...");
两个对象都引用同一个 ModelB 对象,因此,我将这两个对象包含在一个列表中。
List<ModelA> myList = new List<ModelA>();
myList.Add(obj1);
myList.Add(obj2);
现在,如果我在调试器中查看“myList”,我可以看到对 ModelB 的两个引用,但是当我的控制器将它返回给我的客户端时,其中一个会消失。
[HttpGet]
public IHttpActionResult Get(string id)
{
try
{
var myList = _uow.functionality.Get(id);
//myList contains two objects, just like the example
return Ok(myList );
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
}
返回给我的用户的Json如下
[
{$id: 1,
id: 'ed32-...',
name: 'myName',
ModelB: { $id: 2,
$ref: 1,
id: '',
name: ''}},
{$id: 3,
id: 'e3df-...',
name: 'otherName',
ModelB: { $ref: 2 }}
]
为什么在将我的 ModelB 发送到我的客户端时,它会从 json 中删除它?
【问题讨论】:
-
也许我不明白。看起来
ModelB仍然存在于生成的 json 中。 -
@SamIam 是的,ModelB 正在返回第一个关系,但它被排除在第二个关系之外,并替换为第一个关系的 $id 的 $ref
-
Web API 使用json.net。您必须在某处启用
PreserveReferencesHandling。此设置通过在图形中第一次遇到每个对象时使用$id属性标记每个对象,然后仅序列化$ref属性以供后续引用,从而启用图形中对象之间的多对多引用的序列化。跨度> -
@dbc formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;尝试设置为.None,不影响最终结果
标签: c# json http asp.net-web-api