将包含复杂类型数组的复杂类型传递给 Web API
本文关键字:类型 复杂 Web API 包含 数组 | 更新日期: 2023-09-27 18:35:02
这个问题开始,我正在尝试将一个包含复杂对象集合的复杂对象传递给 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
。然后它仍然尝试绑定它,并进入我的操作方法,但模型只包含状态,电话号码是这个奇怪的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"
有没有办法使用这种格式正确指定此对象?或者我是否超出了 Web API 内置模型绑定程序能够执行 ASP.NET 限制?
注意:请不要说"只使用 POST"或"只使用 JSON/XML/Whatever 作为您的内容类型"......如果我能做到这一点,我会的。
到目前为止,没有内置的 Web API 模型绑定器(包括派生的 FromUri 和 FromBody 属性(支持传递包含非基元类类型(不包括 System.String(的任何属性的复杂对象和查询字符串。我遇到了类似的问题,并创建了一个独特的高级自定义模型绑定器,即 FieldValueModelBinder 类,以处理具有通用列表或数组集合的目标对象层次结构。我可以使用源数据的纯查询字符串类型,而无需在其中嵌入任何 JSON 或 XML 结构。模型绑定程序可以像 FromUri 和 FromBody 属性一样简单使用。它还适用于在 URI 和请求正文中传输查询字符串数据。
请阅读我的文章并下载我刚刚使用此链接发布的源代码。还可以从下载源运行测试应用,以获取输入字符串、模型和结果。我希望这是您需要的正确解决方案。