将字符串数组发布到Web API方法

时间:2013-01-08 05:43:33

标签: c# javascript ajax post asp.net-web-api

这是我的客户端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

表单数据视图URL编码

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

这是我的webapi控制器方法:

public HttpResponseMessage UpdateStatusToDelete(string[] data)

结果:

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

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

7 个答案:

答案 0 :(得分:30)

对于传递简单类型,要发布的数据必须采用名称值对的形式,名称部分为空字符串。所以你需要像这样进行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)

这应该可以解决问题。

答案 1 :(得分:3)

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

E.g。通过以下内容:

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..."); }
    });

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

public HttpResponseMessage UpdateStatusToDelete(FormDataCollection formData) {
    string[] data = formData.GetValues("data");
    ...
}

答案 4 :(得分:0)

使用上面的方法在jquery ajax调用中按照cris的建议发送数组。 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项目的models文件夹下创建一个类文件。可能 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
} 

我相信这会奏效。

答案 5 :(得分: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()

答案 6 :(得分: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)