【问题标题】:How can I suppress extra properties added by BreezeController?如何抑制 BreezeController 添加的额外属性?
【发布时间】:2014-02-14 23:15:56
【问题描述】:

NoDB example 之后,我将现有的WebAPI 控制器更改为使用Breeze.WebApi2.BreezeController 注释。这改变了 JSON 结果从一些非常简单的东西:

[{"Name":"Thing1","Description":"Description of Thing 1"},
{"Name":"Thing2","Description":"Another description"}]

对于一些更复杂和占用带宽的东西:

[{"$id":"1","$type":"MyCompany.MyProduct.Models.ContentType, MyCompany.MyProduct","Name":"Thing1","Description":"Description of Thing 1"},
{"$id":"2","$type":"MyCompany.MyProduct.Models.ContentType, MyCompany.MyProduct","Name":"Thing2","Description":"Another description"}]

正如this previous question 中所述,额外信息实际上并不向客户端提供元数据。我仍然必须手动定义它。

鉴于以上,两个问题:

  1. 如果我仍然需要在客户端上定义元数据,额外信息的用途是什么?
  2. 有没有办法抑制额外的属性?

【问题讨论】:

    标签: javascript asp.net-web-api breeze


    【解决方案1】:

    $id、$type 和 $ref 属性由 Json.NET 在序列化期间在服务器上添加。默认情况下,Breeze 客户端使用 $type 属性来确定要实现的“EntityType”。 $id 和 $ref 属性用于处理对象图,因此被引用实体的 json 永远不会被多次表达。这可能是 EntityQuery 'expand' 方法调用的结果或通过 'select' 方法在任意数量的复杂投影中发生的。

    Breeze 不需要这些,但如果您抑制它们(通过服务器上的 Json.NET 设置),那么您将需要实现一个客户端“jsonResultsAdapter”来处理上述所有内容。

    【讨论】:

    • 所以仅仅通过添加 BreezeController 注解就改变了响应的序列化方法?如果微风客户端使用 $type 为什么我还需要在客户端手动定义元数据?
    • 元数据不仅仅是名称,它是关于每个属性的数据类型、实体类型之间的关系等等的数据。 $type 只是让微风客户端将序列化的 json 连接到所有其他元数据。除非从服务器(默认)发送或在客户端的代码中创建,否则这些元数据在客户端上均不可用。
    • $type 没有任何意义,除非客户端知道 $type 是什么 - 它有什么字段,每个字段的数据类型和验证规则是什么,什么它的主要关键是,它与其他类型的关系是什么。所有这些都在元数据中定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2012-01-13
    相关资源
    最近更新 更多