2016-07-29 52 views
0

我遇到了一些与我的WebAPI有关的问题。C#Api删除对象

我有以下型号。

MODELA

Guid id; 
String name; 
Guid ModelBId; 
virtual ModelB ModelB; 

ModelB

Guid id; 
String name; 

我创建与MODELA的2个实例的列表,每个实例有一个名字和具有相同的参考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 }} 
] 

为什么它从JSON中删除我的ModelB它发送给我的客户?

+0

也许我不明白。它看起来像'ModelB'仍然存在于生成的json中。 –

+0

@SamIam是的,ModelB在第一个关系上返回,但它被排除在第二个关系之外,并且被$ ref替换为第一个关系的$ id –

+2

Web API使用[tag:json.net]。某处必须启用['PreserveReferencesHandling'](http://www.newtonsoft.com/json/help/html/PreserveReferencesHandlingObject.htm)。该设置允许在图中的对象之间进行多对多的引用的序列化,方法是在图中第一次遇到'$ id'属性时标记每个对象,然后为随后的引用序列化一个'$ ref'属性。 – dbc

回答

1

继@dbc建议,我从

formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All; 

改变了JSON序列化

formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None; 
formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling 
      = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 
0

恢复顺序是否会消失?也许尝试以不同的格式返回列表,例如一个直的JSON对象。

+0

已尝试,无结果= s –