从this question扩展,我试图将包含复杂对象集合的复杂对象传递给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
...或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
...然后它仍然试图绑定它,并进入我的动作方法,但模型只包含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 /无论你的内容类型是什么”......如果我能够做到这一点,我会
答案 0 :(得分:8)
到目前为止,没有内置的Web API模型绑定器(包括派生的FromUri和FromBody属性)支持传递包含查询字符串的非基本类类型(不包括System.String)的任何属性的复杂对象。我遇到了类似的问题,并创建了一个独特的高级自定义模型绑定器FieldValueModelBinder类,用于处理具有通用列表或数组集合的目标对象层次结构。我可以使用纯查询字符串类型的源数据,而无需将任何JSON或XML结构嵌入其中。模型绑定器可以像FromUri和FromBody属性一样简单使用。它还可以有效地在URI和请求体中传输查询字符串数据。
请阅读我的文章并使用此link下载我刚发布的源代码。您还可以从下载源运行测试应用程序,以获取输入字符串,模型和结果。我希望这是您需要的正确解决方案。