将json发布到mvc 4 WebApi控制器操作。 为什么不反序列化我的数组呢?
以下一直让我有点疯狂。 我发现了几个类似的问题,但他们没有提供解决方案。 我试图发布一个包含一些数据项的json对象。 其中一个是对象本身的列表。 这里是:
{ "ClaimType":"Trade", "ClaimedProductId":"4", "ClaimingUserId":"2", "Message":"test", "TradeOffers":[ { "OfferedProductId":"7", "OfferedQuantity":"5" }, { "OfferedProductId":"12", "OfferedQuantity":"2" } ] }
这个jsonvalidation了。
我的控制器看起来像这样:
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 TradeOffers { get; set; } }
为了完整起见,这里是TradeOffer类:
public class TradeOffer { int OfferedProductId { get; set; } int OfferedQuantity { get; set; } }
在我开始从Javascript发布post之前,我喜欢使用Chrome RestConsole来测试这个坏男孩,所以我可以在引擎盖下看起来更好一些。 我使用以下设置发出请求:
- 它是一个POST请求
- BODY内容类型是“application / json”
- 我将json作为RAW Body中的请求有效负载发送
接下来会发生什么:我的ClaimViewModel
上的所有属性ClaimViewModel
容易反序列化。 但是, TradeOffers
属性得到实例化,当调试显示一个计数为2的列表(到目前为止很好),但此列表中的对象的值(属性OfferedProductId
和OfferedQuantity
)始终为0 /零(不为空!)
TradeOffer
类中的属性是私有的(C#中的默认访问修饰符),这使得无法从外部设置它们。 尝试将它们public
:
public class TradeOffer { public int OfferedProductId { get; set; } public int OfferedQuantity { get; set; } }
您在TradeOffer的房产真的是私人的吗? 如果是这样,那些需要公开。
此外,
public List TradeOffers { get; set; }
应该
public List TradeOffer { get; set; }
或者您应该将名称更改为JSON集合中的复数版本