2016-05-14 247 views
0

我有两个模型:儿童和位置。他们有关系。这是什么地方的样子:使用JSON和Web API的POST请求?

public class Location { 
    [Key] 
    public int Id { get; set; } 
    public float Latitude { get; set; } 
    public float Longitude { get; set; } 
    public float Accuracy { get; set; } 
    public DateTime ReportTime { get; set; } 

    [JsonIgnore] 
    public virtual Child Child { get; set; } 
} 

`

子模型沿着这些线路(名字,姓氏等)的外观和有ICollection<Location> Locations参考。

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

[ResponseType(typeof(Location))] 
     public IHttpActionResult PostLocation([FromBody] Location location) 
     { 
      if (!ModelState.IsValid) 
      { 
       return BadRequest(ModelState); 
      } 

      db.Locations.Add(location); 
      db.SaveChanges(); 

      return CreatedAtRoute("DefaultApi", new { id = location.Id }, location); 
     } 

投递使用JSON从移动设备的数据,理想我想通过孩子的ID值,而不是整个子对象的。但是,每次检查传入的Location对象时,child属性都设置为null。我曾尝试以下JSONs:

{ 
    "Latitude": 43.63434, 
    "Longitude": -92.12345, 
    "Accuracy": 13, 
    "ReportTime": "2016-05-11T23:29:30.87", 
    "Child": { 
     "Id": 3 
    } 
} 

{ 
    "Latitude": 43.63434, 
    "Longitude": -92.12345, 
    "Accuracy": 13, 
    "ReportTime": "2016-05-11T23:29:30.87", 
    "Child": 3 
} 

我甚至试图通过整个Child对象(复制/粘贴我从我自己的细节得到了GET ApiController),但孩子仍然设置为空。

我对ASP.NET很新,尤其是Web API,所以我很感激任何帮助。我如何指示WebAPI至少解析Child对象的ID部分?

我知道技术上我可以通过向位置模型添加另一个属性来解决此问题,int ChildId - 但我想知道是否有更优雅的解决方案(有很多与Child相关的模型)。

谢谢!

+0

我看你使用的是复合类型(位置)。尝试将FromBody更改为FromUri。如果它不起作用,请尝试删除它。今天早些时候,当我发布的JSON对象为空时,我有这个问题。参考param绑定http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api –

+1

删除'[JsonIgnore]''儿童的财产。但是因为你只发布了一个'Child'的属性,你应该创建一个只包含你需要的属性的视图模型(并且它的属性是'int ChildId'而不是'Child Child') –

回答

0

将孩子的属性名称更改为其他名称。例如。

public virtual Child ChildProp { get; set; } 

而且您的JSON数据:

{ 
"Latitude": 43.63434, 
"Longitude": -92.12345, 
"Accuracy": 13, 
"ReportTime": "2016-05-11T23:29:30.87", 
"ChildProp": { 
    "Id": 3 
    } 
}