2016-05-14 248 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 
    } 
}