【问题标题】:Passing complex type containing array of complex types to Web API将包含复杂类型数组的复杂类型传递给 Web API
【发布时间】:2013-10-18 14:03:26
【问题描述】:

this question 扩展,我正在尝试将包含复杂对象集合的复杂对象传递给 ASP.NET Web API 控制器操作方法,但我无法找到正确的格式用于我的请求中的输入对象。继续 Christopher Johnson 的问题中的示例(并删除一些简单的字段),如果我将他的 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 东西。这是我的调试器 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/Whatever 作为您的 Content-Type”...如果我能够做到这一点,我会.

【问题讨论】:

    标签: c# forms asp.net-web-api content-type


    【解决方案1】:

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

    请阅读我的文章并下载我刚刚使用link 发布的源代码。您还可以从下载源中为您的输入字符串、模型和结果运行测试应用程序。我希望这是您需要的正确解决方案。

    【讨论】:

    • 这正好解决了我的问题!谢谢,欢迎来到 SO :)
    猜你喜欢
    • 2016-06-12
    • 1970-01-01
    • 2022-11-08
    • 1970-01-01
    • 2016-10-01
    • 2021-10-19
    • 2020-09-18
    • 1970-01-01
    • 2014-07-05
    相关资源
    最近更新 更多