发布子类集合

时间:2012-10-12 12:08:59

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

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

  • QuoteForProductTypeA
  • QuoteForProductTypeB

所有引用类型共享一个公共基类,例如QuoteBase。

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

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

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

然而,我现在陷入困境,只有很少的文档/博客如何做到这一点。

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

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

1 个答案:

答案 0 :(得分:9)

如果您的帖子集合来自请求正文,则不会通过模型绑定器。 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}]