将包含复杂类型数组的复杂类型传递给Web API

从这个问题延伸,我试图将包含复杂对象集合的复杂对象传递给ASP.NET Web API控制器操作方法,但是我在查找用于输入对象的正确格式时遇到了问题。请求。 继续从克里斯托弗约翰逊的问题(并删除一些字段为简单)的例子,如果我改变他的PhoneRequest对象包含一组电话号码…

 public class PhoneRequest { public string[] PhoneNumbers { get; set; } public string State { get; set; } } 

…我将参数作为URL编码的查询字符串传递:

 /api/phonenumber?id[0][State]=UT&id[0][PhoneNumbers][0]=555-1234567 

…或将其作为html表单编码( Content-Type: application/x-www-form-urlencoded )请求正文:

 [0][State]=UT&[0][PhoneNumbers][0]=555-1234567 

……然后一切都很好。 但是如果我将PhoneNumbers从一组字符串更改为一个新的PhoneNumber类型的集合……

 public class PhoneRequest { public PhoneNumber[] PhoneNumbers { get; set; } public string State { get; set; } } public class PhoneNumber { string AreaCode { get; set; } string Number { get; set; } } 

……鉴于之前的结果,我在我看来是合乎逻辑的方式传递物体……

 id[0][State]=UT&id[0][PhoneNumbers][0][AreaCode]=555&id[0][PhoneNumbers][0][Number]=1234567 

…或者再次作为一个html表格邮寄身体……

 [0][State]=UT&[0][PhoneNumbers][0][AreaCode]=555&[0][PhoneNumbers][0][Number]=1234567 

…然后它仍尝试绑定它,并进入我的动作方法,但模型只包含State,电话号码是这个奇怪的ComplexUriAndFormObject事物。 这是我的调试器Watch的复制粘贴:

 phoneRequest {ComplexUriAndFormObject.Models.PhoneRequest[1]} [0] {ComplexUriAndFormObject.Models.PhoneRequest} PhoneNumbers {ComplexUriAndFormObject.Models.PhoneNumber[1]} [0] {ComplexUriAndFormObject.Models.PhoneNumber} AreaCode null Number null State "UT" 

有没有办法使用这种格式正确指定这个对象? 或者我是否超出了ASP.NET Web API内置的模型绑定器能够做到的限制?

注意:请不要说“只使用POST”或“只使用JSON / XML /无论你的内容类型如何”……如果我能够做到这一点,我会的。

到目前为止,没有内置的Web API模型绑定器(包括​​派生的FromUri和FromBody属性)支持传递包含查询字符串的非基本类类型(不包括System.String)的任何属性的复杂对象。 我遇到了类似的问题,并创建了一个独特的高级自定义模型绑定器FieldValueModelBinder类,用于处理具有通用列表或数组集合的目标对象层次结构。 我可以使用纯查询字符串类型的源数据,而无需将任何JSON或XML结构嵌入其中。 模型绑定器可以像FromUri和FromBody属性一样简单使用。 它还可以有效地在URI和请求体中传输查询字符串数据。

请阅读我的文章并使用以下链接下载我刚发布的源代码: http : //www.codeproject.com/Articles/701182/A-Custom-Model-Binder-for-Passing-Complex-Objects 。 您还可以从下载源运行测试应用程序,以获取输入字符串,模型和结果。 我希望这是您需要的正确解决方案。