3

以下一直让我有点发疯。我发现了几个类似的问题,但他们没有提供解决方案。我正在尝试发布一个包含一些数据项的 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 请求
  • 正文内容类型是“应用程序/json”
  • 我将 json 作为 RAW Body 中的请求有效负载发送

然后发生的事情是:我的所有属性都ClaimViewModel可以轻松反序列化。但是,该TradeOffers属性被实例化,并且在调试时显示一个计数为 2 的列表(到目前为止还不错),但该列表中对象的值(属性OfferedProductIdOfferedQuantity)始终为 0/零(不是 null!)

4

2 回答 2

7

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

public class TradeOffer
{
    public int OfferedProductId { get; set; }
    public int OfferedQuantity { get; set; }
}
于 2013-07-17T13:56:43.680 回答
1

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

此外,

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

应该

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

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

于 2013-07-17T13:56:14.297 回答