这是我的客户端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
我做错了什么?任何帮助都非常感谢。
答案 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();
}
}
答案 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)