从this question扩展上,我试图通过包含复杂对象的集合到ASP.NET Web API控制器的操作方法一个复杂的对象,但我无法找到正确的格式在请求中使用我的输入对象。继续从克里斯托弗·约翰逊的问题的例子(和simplicty移除某些字段),如果我改变他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
...或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 /无论作为您的Content-Type” ......如果我能做到这一点,我会的。
到现在为止,没有内置的Web API模型粘合剂,包括衍生FromUri和FromBody属性支持通过一个复杂的对象,它包含与查询字符串非基本类类型的任何财产(不包括System.String)。我有类似的问题,并创造了独特的,先进的自定义模型粘结剂,将FieldValueModelBinder课,在具有泛型列表或阵列收集目标对象层次的工作。我可以使用源数据的纯查询字符串类型没有嵌入任何JSON或XML结构进去。该模型粘结剂可以作为容易,因为FromUri和FromBody属性。它也可以有效地在这两个URI和请求主体的查询字符串数据传输。
请阅读我的文章和下载源代码使用这个link我刚才公布。您也可以为您输入的字符串,模型和运行结果从下载源测试程序。我希望这是你需要的解决方案。