11

这是我的客户端 ajax 调用:

    var list = ["a", "b", "c", "d"];

    var jsonText = { data: list };

    $.ajax({
        type: "POST",
        url: "/api/scheduledItemPriceStatus/updateStatusToDelete",
        data: jsonText,
        dataType: "json",
        traditional: true,
        success: function() { alert("it worked!"); },
        failure: function() { alert("not working..."); }
    });

这是 chrome 网络标头:

Request URL:http://localhost:2538/api/scheduledItemPriceStatus/updateStatusToDelete

Request Method:POST

Request Headersview source

Accept:application/json, text/javascript, */*; q=0.01

Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3

Accept-Encoding:gzip,deflate,sdch

Accept-Language:en-US,en;q=0.8

Connection:keep-alive

Content-Length:27

Content-Type:application/x-www-form-urlencoded; charset=UTF-8

Host:localhost:2538

Origin:http://localhost:2538

Referer:http://localhost:2538/Pricing/ScheduledItemPrices

User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11

X-Requested-With:XMLHttpRequest

表单 Dataview URL 编码

data:a
data:b
data:c
data:d

这是我的 webapi 控制器方法:

public HttpResponseMessage UpdateStatusToDelete(string[] data)

结果:

当我调试时,UpdateStatusToDelete 中的 data 参数返回{string[0]}而不是 data:a data:b data:c data:d

我究竟做错了什么?非常感谢任何帮助。

4

7 回答 7

34

为了传递简单的类型,要发布的数据必须采用名称值对的形式,其中名称部分为空字符串。所以你需要像这样进行 Ajax 调用:

$.ajax({
  type: "POST",
  url: "/api/values",
  data: { "": list },
  dataType: "json",
  success: function() { alert("it worked!"); },
  failure: function() { alert("not working..."); }
});

此外,在您的 Web API 操作上,使用 [FromBody] 属性对其进行注释。就像是:

public void Post([FromBody]string[] values)

这应该够了吧。

于 2013-01-11T22:55:43.040 回答
4

你应该传递它list本身,而不是任何其他包装它的对象。

例如,通过以下内容:

var list = ["a", "b", "c", "d"];

$.ajax({
        type: "POST",
        url: "/api/scheduledItemPriceStatus/updateStatusToDelete",
        // Pass the list itself
        data: list, 
        dataType: "json",
        traditional: true,
        success: function() { alert("it worked!"); },
        failure: function() { alert("not working..."); }
    });

您在服务器上的方法签名是正确的。

于 2014-12-08T07:21:04.643 回答
2

利用var jsonText = { data: JSON.stringify(list)}

于 2013-01-08T05:52:44.840 回答
1

在后端,您可以使用FormDataCollection.GetValues(string key)为该参数返回一个字符串数组。

public HttpResponseMessage UpdateStatusToDelete(FormDataCollection formData) {
    string[] data = formData.GetValues("data");
    ...
}
于 2017-02-17T08:28:30.383 回答
0

使用上面的方法按照 cris 在 jquery ajax 调用中的建议发送数组。JSON 数据通常在键值对中。

  var tmp = [];
  tmp.push({
  //this is the key name 'a'  "a": "your value", //it could be anything here in 
   //string format.
    "b": "b",
    "c": "c",
    "d": "d"
   });

 { data: JSON.stringify(tmp);} 

您也可以通过使用二维数组来完成上述操作

另外在 webapi 项目中执行此操作。

在您的 web api 项目的模型文件夹下创建一个类文件。可能是 class1.cs

创建 4 个属性

public string a {get; set;}
public string b {get; set;}
public string c {get; set;}
public string d {get; set;}

现在在您的控制器中执行此操作

using projectname.models

[HttpPost]
public return-type actionname(List<Class1> obj)
{
  //Further logic goes here
} 

我相信这会奏效。

于 2014-12-21T16:17:51.663 回答
0

设置 dataType 对您没有帮助。

我就是这样做的:

var SizeSequence = {};
SizeSequence.Id = parseInt(document.querySelector("dd#Sequence_Id").textContent);
SizeSequence.IncludedSizes = [];
var sizes = document.querySelectorAll("table#IncludedElements td#Size_Name");
// skipping the first row (template)
for (var i = 1, l = sizes.length ; i != sizes.length ; SizeSequence.IncludedSizes.push(sizes[i++].textContent));

$.ajax("/api/SizeSequence/" + SizeSequence.Id, { 
     method: "POST",
     contentType: "application/json; charset=UTF-8",
     data: JSON.stringify(SizeSequence.IncludedSizes), 
...

服务器部分

// /api/SizeSequence/5
public async Task<IHttpActionResult> PostSaveSizeSequence(int? Id, List<String> IncludedSizes)
    {
        if (Id == null || IncludedSizes == null || IncludedSizes.Exists( s => String.IsNullOrWhiteSpace(s)))
            return BadRequest();
        try
        {

            await this.Repo.SaveSizeSequenceAsync(Id.Value, IncludedSizes );
            return Ok();
        }
        catch ( Exception exc)
        {
            return Conflict();
        }
    }

参考

jQuery.ajax()

于 2015-05-29T18:07:32.800 回答
0

您也可以使用 来执行此操作JSON.stringify,这在语义上比将内容放入具有空字符串键的对象中更直观。(我正在使用 Web API 2,不确定这是否重要。)

客户端代码

$.ajax({
    type: 'POST', //also works for PUT or DELETE
    url: '/api/UserRole',
    contentType: "application/json",
    data: JSON.stringify(["name1", "name2"])
})

服务器代码

[HttpPost]
[Route("api/UserRole")]
public IHttpActionResult AddUsers(string[] usernames)
于 2020-06-21T21:19:39.723 回答