【问题标题】:Posting a collection of subclasses发布子类的集合
【发布时间】:2012-10-12 12:08:58
【问题描述】:

我要求用户编辑潜在客户的报价列表,报价可以是不同的类型,例如:

  • QuoteForProductTypeA
  • QuoteForProductTypeB

所有报价类型共享一个公共基类,例如 QuoteBase。

我的报价在前端显示良好,并且似乎也回发了正确的数据。

但是,在服务器上它显然不知道要使用哪个子类,所以只使用基类。

我认为我需要某种用于 WebApi 的自定义模型绑定器来检查隐藏字段,例如包含集合中对象类型的 ModelType,模型绑定器然后创建此类型的新对象并绑定属性从我发布的值到这个对象。

然而,我被困在这一点上,几乎没有关于如何做到这一点的文档/博客。

我检查了 WebApi 的源代码,看看我是否可以扩展默认模型绑定器,但任何默认值都是密封类。

我只能通过外观实现 IModelBinder,我可以通过查找名为 ModelType 的值来创建正确的模型类型,但是我不确定如何填充子类中的其余值(如果有)是我继承的默认模型绑定器,我只调用基类绑定方法。

【问题讨论】:

    标签: c# knockout.js asp.net-web-api model-binding


    【解决方案1】:

    如果您的帖子集合来自请求正文,则不会通过模型绑定器。 Web API 将使用格式化程序来反序列化内容。

    如果你只是想支持 json,这很容易。只需将以下代码添加到您的 Web api 配置中:

    config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto;
    

    如果运行时类型与声明类型不同,该设置将让 json.net 将类型名称保存在有效负载中。当您将其回传时,json.net 会将有效负载反序列化为您在有效负载中指定的类型。

    示例负载如下所示:

    {"$type":"MvcApplication2.Models.Car, MvcApplication2","SeatCount":10,"WheelCount":4,"Model":0,"Brand":null}]
    

    【讨论】:

    • 谢谢你,成功了。我正在将我的模型序列化为 json,以便使用以下代码来使用 knockoutJs:Html.Raw(Json.Encode(Model)),但是我不得不换出这段代码以使用 Json.Net 序列化程序,并在那里指定 TypeNameHandling 选项也...以防万一其他人正在寻找答案。
    • 如果它对其他人有帮助 - $type 必须是对象中列出的第一个字段,否则 JSON.Net 将无法反序列化它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多