2015-05-06 15 views
0

我正面临Web API控制器的小陌生问题。我有一个正在通过api控制器的动作传递的集合。使用的对象是集合有4个属性。WebApi控制器模型序列化问题

当属性按特定顺序排列时,我的操作能够接受收集参数。见下图: -

[HttpPost] 
    public ForexRates UpdateRates([FromBody] Rates rates) 
    { 
     // TODO: Obviously code :) 
     return rates; 
    } 

此代码是从邮差调用API控制器&地方。见下面: -

<rates> 
    <rate> 
    <id>fefef</id> 
    <rate>35353.333</rate> 
    <series>dfefge</series> 
    <series-order>sfefefef</series-order> 
</rate></rates> 

如果我改变属性的顺序,我开始在我的行动得到空值。可有一个人请解释一下:)

模型

public class Rate 
{ 
    public string Id { get; set; } 
    public string Date { get; set; } 
    public double Rate { get; set; } 
} 

public class Rates : Collection<ForexRate> 
{ 
} 
+1

请加率的实施和价格 –

+0

我已经加入模型以及。 – ggtffg

回答

1

你需要控制与您的XML序列化的顺序。使用XmlElementAttribute并指定订单

有一个类似的问题here

仅供参考,我想有没有办法让你改变属性的顺序,当你从PostMan提供给你的WebAPI服务。您需要遵循确切的顺序。

如果你不想那么做,那么将这个Xml作为字符串参数然后在一个方法中解析它。

0

当绑定过程中在不同位置使用相同名称时,默认绑定器可能会出现问题。

在你的情况你有Rate.Rate - 类名和属性名。尝试将您的课程更改为(以及相应的xml文章):

public class Rate 
{ 
    public string Id { get; set; } 
    public string Date { get; set; } 
    public double Value { get; set; } 
} 

然后尝试更改顺序。

尽管我没有明确的理由说明它为什么在一个订单中工作,而不是另一个订单,它可能会在达到速率(双倍)值时尝试创建新的速率(对象),但不会有正确的属性(因为它只是一个双)。

更复杂的解决方案是为Rate对象编写特定的模型联编程序。

+0

其实不是!我的class n属性的名称不一样。这里发布的模型只是DTO类的虚拟名称。 – ggtffg

+0

是创建模型绑定是替代解决方案,但仍然在我尝试下一步之前,我想有这种情况的原因。 – ggtffg

+0

好的,好吧,只能提供所提供的信息。 –

0

该问题与DataContractSerializer有关,该DataContractSerializer期望元素按特定顺序(按字母顺序排列,并考虑到继承)发生。这是创建Web API项目时使用的默认序列化程序。

您可以忽略这一点,类似这样的API配置过程中指定一个不同的串行:

GlobalConfiguration.Configuration.Formatters.XmlFormatter 
    .SetSerializer<SomeType>(new XmlSerializer(typeof(SomeType)));