【问题标题】:How to properly POST json data to Web API 2 actions如何正确地将 json 数据发布到 Web API 2 操作
【发布时间】:2017-07-22 16:50:15
【问题描述】:

我有一个 ASP.NET MVC 5 Web 应用程序,它使用 HTTP POST 将数据发送到 ASP.NET Web API 2 操作。 Web API 动作被命中,但数据全部为空。

POST 发送自:

var url = 'http://MyWebApi/api/MyController/MyAction/1';
var obj = { pamA: 'a', pamB: 1 };
var data = { json: ko.toJSON(obj) };
// var data = ko.toJSON(obj); // tried this too, but same problem.

$.ajax({
    type: 'post',
    dataType: 'json',
    url: url,
    data: data,
});

我的 Web API 操作是:

[System.Web.Http.HttpPost]
[System.Web.Http.Route("{id:int}")]
[ResponseType(typeof(Models.MyModel))]
[EnableCors(origins: "*", headers: "*", methods: "*")]
public IHttpActionResult Post(int id, Models.MyModel json){
  return Ok(200); // break point is hit but json doesn't have the data sent from client.
}

我的模型是:

public class MyModel{
    public string pamA {get; set;}
    public int pamB {get; set;}
}

【问题讨论】:

  • 试试:var data = ko.toJSON(obj);
  • @ChrisPratt,我试过了,但仍然是同样的问题。谢谢。
  • 好的,接下来,在你的 AJAX 调用中使用 contentType: "application/json"
  • 您可能还想尝试在 json 参数前加上 [FromBody]: [FromBody]Models.MyModel json
  • @ChrisPratt,将 'dataType' 更改为 'contentType' 值 'application/json' 修复了它。多么奇怪!谢谢!

标签: asp.net-mvc-5 asp.net-web-api2


【解决方案1】:

首先,为了清楚起见,我建议您在网络操作中标记参数的来源。像这样的

[System.Web.Http.HttpPost]
[System.Web.Http.Route("{id:int}")]
[ResponseType(typeof(Models.MyModel))]
[EnableCors(origins: "*", headers: "*", methods: "*")]
public IHttpActionResult Post([FromUri]int id, [FromBody]Models.MyModel json){
  return Ok(200); // break point is hit but json doesn't have the data sent from client.
}

现在这不是你的问题,只是我很着迷。无论如何,我认为您的问题源于您的 ajax 请求。

var url = 'http://MyWebApi/api/MyController/MyAction/1';
var obj = { pamA: 'a', pamB: 1 };
var data = { json: ko.toJSON(obj) };

$.ajax({
    type: 'post',
    dataType: 'json',
    url: url,
    data: data,
});

应该是:

var url = 'http://MyWebApi/api/MyController/MyAction/1';
var data = { pamA: 'a', pamB: 1 };

$.ajax({
    type: 'post',
    dataType: 'json',
    url: url,
    data: data,
});

您的 MyModel 对象期望 json 具有字段 pmA 和 pamB。但是您的 json 对象 实际上 看起来像这样 {"json": {"pamA":"a", "pamB":1} } 您的 json 表示该对象应包含一个名为“json”的属性,该属性映射到具有属性 pamA 和 pamB 的对象。为了让您的 MyModel 对象能够映射到您当前发送的 json,它必须看起来像这样。

public class OtherModel {
       public MyModel json;
}

但我建议你去掉“json”字段,让你的 json 请求看起来像这样:{ pamA: 'a', pamB: 1 }

【讨论】:

  • 更改 var data = {pamA: 'a', pamB: 1} 使其工作。位置标记 [FromUri] 是可选的。
  • 是的,我知道它们是可选的,我只是说这是一个建议。我喜欢这样做以明确数据的来源。所以我回答了这个问题,没有投票?
【解决方案2】:

对于 jQuery 的 ajax 方法,dataType 指定了您期望的响应,因此您可能仍然需要它。 contentType 选项指定请求正文的格式,默认为application/x-www-form-urlencoded,因此您需要指定application/json

$.ajax({
    type: 'post',
    dataType: 'json',
    contentType: 'application/json',
    url: url,
    data: data,
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-12
    • 2017-10-05
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多