通过复杂类型的复杂含阵列型对Web API

问题描述 投票:4回答:1

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” ......如果我能做到这一点,我会的。

c# forms asp.net-web-api content-type
1个回答
8
投票

到现在为止,没有内置的Web API模型粘合剂,包括衍生FromUri和FromBody属性支持通过一个复杂的对象,它包含与查询字符串非基本类类型的任何财产(不包括System.String)。我有类似的问题,并创造了独特的,先进的自定义模型粘结剂,将FieldValueModelBinder课,在具有泛型列表或阵列收集目标对象层次的工作。我可以使用源数据的纯查询字符串类型没有嵌入任何JSON或XML结构进去。该模型粘结剂可以作为容易,因为FromUri和FromBody属性。它也可以有效地在这两个URI和请求主体的查询字符串数据传输。

请阅读我的文章和下载源代码使用这个link我刚才公布。您也可以为您输入的字符串,模型和运行结果从下载源测试程序。我希望这是你需要的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.