【问题标题】:C# Api Removing ObjectsC# Api 删除对象
【发布时间】: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


【解决方案1】:

恢复订单是否有任何启示?也许尝试以不同的格式返回列表,例如一个直接的 JSON 对象。

【讨论】:

    【解决方案2】:

    根据@dbc 的建议,我已将 json 序列化从

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 2012-01-08
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      相关资源
      最近更新 更多