【问题标题】:POST request using JSON and Web API?使用 JSON 和 Web API 的 POST 请求?
【发布时间】:2016-05-14 05:25:58
【问题描述】:

我有两个模型:Child 和 Location。他们有关系。这是位置的样子:

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; }
}

`

Child 模型沿着这些思路(FirstName、LastName 等)查找,并且引用了 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 从移动设备发布数据时,理想情况下,我希望传递 Child 的 ID 值而不是整个 Child 对象。但是,每次检查传入的Location 对象时,child 属性都会设置为null。我尝试了以下 JSON:

{
    "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 中获得的内容),但子对象仍设置为 null。

我对 ASP.NET 尤其是 Web API 还是很陌生,因此我将不胜感激。如何指示 WebAPI 至少解析 Child 对象的 ID 部分?

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

谢谢!

【问题讨论】:

  • 我看到您使用的是复杂类型(位置)。尝试将 FromBody 更改为 FromUri。如果它不起作用,请尝试将其删除。今天早些时候,当我发布的 JSON 对象为空时,我遇到了这个问题。参数绑定参考asp.net/web-api/overview/formats-and-model-binding/…
  • Child 属性中删除 [JsonIgnore]。但是由于您只发布了Child 的一个属性,因此您应该创建一个仅包含您需要的那些属性的视图模型(并且它将具有属性int ChildId 而不是Child Child

标签: asp.net asp.net-mvc asp.net-web-api json.net


【解决方案1】:

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

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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 2014-11-19
    • 2017-05-07
    • 2020-07-06
    • 2016-04-10
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多