将json发布到mvc 4 Web Api控制器操作。为什么不反序列化我的数组?

时间:2013-07-17 13:52:49

标签: c# json asp.net-mvc-4 asp.net-web-api

以下一直让我有点疯狂。我发现了几个类似的问题,但他们没有提供解决方案。我试图发布一个包含一些数据项的json对象。其中一个是对象本身的列表。这是:

{
"ClaimType":"Trade",
"ClaimedProductId":"4",
"ClaimingUserId":"2",
"Message":"test",
"TradeOffers":[
  {
     "OfferedProductId":"7",
     "OfferedQuantity":"5"
  },
  {
     "OfferedProductId":"12",
     "OfferedQuantity":"2"
  }
]
}

这个json验证了。

我的控制器看起来像这样:

public class ProductController : ApiController
{
    [HttpPost]
    public void Claim(ClaimViewModel claimViewModel)
    {
        //do some amazing stuff with the data from the viewmodel.
        //sorry guys. This stuff is just tooo cool to be posted here for all to see
        //NOT ;-)  
    }
}

我发布的ClaimViewModel看起来像这样:

public class ClaimViewModel
    {
    public Claim.ClaimRequestTypes ClaimType { get; set; } 
    public int ClaimedProductId { get; set; }
    public int ClaimingUserId { get; set; }
    public string Message { get; set; }
    public List<TradeOffer> TradeOffers { get; set; }
    }

为了完整起见,这里是TradeOffer类:

public class TradeOffer
{
    int OfferedProductId { get; set; }
    int OfferedQuantity { get; set; }
}

在我开始使用Javascript发布帖子之前,我喜欢使用Chrome RestConsole来测试这个坏男孩,所以我可以更好地了解一下。我使用以下设置提出请求:

  • 是一个POST请求
  • BODY内容类型为“application / json”
  • 我将json作为RAW Body中的请求有效负载发送

接下来会发生什么:我的ClaimViewModel上的所有属性都被反序列化了。但是,TradeOffers属性被实例化,并且当调试显示计数为2的列表(到目前为止很好)时,此列表中的对象的值(属性OfferedProductIdOfferedQuantity )总是0 /零(不为空!)

2 个答案:

答案 0 :(得分:7)

TradeOffer类中的属性是私有的(C#中的默认访问修饰符),这使得无法从外部设置它们。尝试制作public

public class TradeOffer
{
    public int OfferedProductId { get; set; }
    public int OfferedQuantity { get; set; }
}

答案 1 :(得分:1)

您在TradeOffer的房产真的是私密的吗?如果是这样,那些需要公开。

此外,

public List<TradeOffer> TradeOffers { get; set; }

应该是

public List<TradeOffer> TradeOffer { get; set; }

或者您应该将名称更改为JSON集合中的复数版本