2013-10-10 63 views
4

this question扩展开来,我试图将包含复杂对象集合的复杂对象传递给ASP.NET Web API控制器操作方法,但我正在查找请求中输入对象的正确格式时遇到问题。继续从克里斯托弗·约翰逊的问题的例子(和消除对simplicty某些字段),如果我改变他PhoneRequest对象包含电话号码的集合...将包含复杂类型数组的复杂类型传递给Web API

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 

...或POST它作为编码的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 

...那么它仍然使绑定它一个尝试,并进入我的行动方法,但是该模型只包含状态,并且电话号码是这个奇怪的ComplexUriAndFormObject的事情。这是从我的调试器复制粘贴观看:

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 /无论作为您的内容类型”......如果我能做到这一点,我会的。

回答

8

到目前为止,没有内置的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。您也可以从下载来源为您的输入字符串,模型和结果运行测试应用程序。我希望这是您需要的正确解决方案。

+0

这正好解决了我的问题!谢谢,欢迎来到:) –