我有一个C#网站和Web API,以及一个移动Android应用程序。在移动Android应用程序中,我想将带有List<Integer>
,List<Double>
和long
的HttpPost发送到C#Web API,并在C#Web API中将其转换回{{ 1}},List<int>
和List<decimal>
。
Android应用程序的发送部分完成得非常快,因为我之前已经这样做了。但是在接收C#Web API端,我遇到了很多麻烦。
在其中一个Web API控制器中,我添加了以下方法:
long
现在我正在使用FireFox&#39; RESTClient插件发送这些HttpPOST:
[HttpPost]
[AllowAnonymous]
[ActionName("save")]
public bool SaveOrders([FromBody] STILL_UNDETERMINED parameter)
{
// TODO: Convert given parameter to usable List<int>, List<decimal> and long
}
我最终会在上面的方法中调试它,但现在我需要将它转换为List,List和long。
所以,我的问题:
我应该为该方法使用哪个参数?我已尝试过:
Method: POST http://localhost:54408/api/orders/save
Header: Content-Type application/x-www-form-urlencoded
Body: {"newPrices":[0.4,7.4],"productIds":[20,25],"dateInTicks":1402459200000}
(始终为空); string
(因某些未知原因取代JObject
的所有[
,导致::" {"
; { "{\"newPrices\":": { "0.4,7.4],\"productIds\":": { "20,25],\"dateInTicks\":1402459200000}": "" } } }
(我无法做任何事情,因为它转换为看似空的dynamic
) 我应该如何将此参数转换为object
,List<int>
和List<decimal>
?
自定义对象:
long
理论上看起来很简单:
Data
{
public List<int> productIds { get; set; }
public List<decimal> newPrices { get; set; }
public long dateInTicks { get; set; }
}
对MapHttpRoutes进行一些更改。)看起来很简单,但我无法在C#中使用它。在Java中,我会在不到30分钟的时间内完成这项工作,我可以通过Google-ing找到很多有用的答案,但是我谷歌的C#HttpPOSTs我只得到结果从C#发送HttpPOSTs,或者从发送HttpPOST后的流中读取响应。没有关于从C#mvc中的actions
方法接收HttpPOST的JSON主体..
PS:我的Config文件中有以下内容只接收JSON格式的响应,可能是出了问题。
[HttpPost]
答案 0 :(得分:1)
将JSON数据发布到MVC操作时,您需要将Content-Type
标头指定为application/json
。如果不这样做,如果您传递的不是标准表单集,那么模型将始终为null。
[HttpPost]
[AllowAnonymous]
[ActionName("save")]
public bool SaveOrders(Data model)
{
//model is populated, and you have access to ModelState
}
public class Data
{
// the JSON to Model mapper match is case-insensitive
public List<int> ProductIds { get; set; }
public List<decimal> NewPrices { get; set; }
public long DateInTicks { get; set; }
}
发布数据:
{"newPrices":[0.4,7.4],"productIds":[20,25],"dateInTicks":1402459200000}
答案 1 :(得分:0)
因此,您应该能够将其作为模型对象传递。首先设置模型类:
public class Order
{
public List<int> productIds { get; set; }
public List<decimal> newPrices { get; set; }
public long dateInTicks { get; set; }
}
然后设置您的操作以使用模型绑定到:
[HttpPost]
public ActionResult SaveOrders(Order order)
{
//TODO: Save...
}
然后,您所要做的就是确保将其作为与Order模型匹配的JSON对象发送。所以post值将是[“productIds”],[“newPrices”]等等,它会自动填充SaveOrders上的order参数。这可以很好地理解这些事情如何结合起来:
http://weblogs.asp.net/nmarun/asp-net-mvc-2-model-binding-for-a-collection