2016-07-29 53 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 –