在我的Javascript应用程序中,我试图通过jQuery Ajax将GET请求中的字符串数组以及其他参数传递给ASP.NET Web API REST服务。 网址示例如下:
http://my.services.com/products?userId=1abc&id=1&id=2&id=3
Web API方法的签名:
[HttpGet("products")]
public IActionResult GetProducts(string userId, int[] id)
如果我尝试使用Postman进行请求,则参数绑定将正常工作。在Javascript应用程序中,我尝试了几种没有运气的解决方案。代码如下:
let data = {
'userId': '1abc'
'id': [1,2,3]
}
$.ajax({
type: 'get',
url: 'http://my.services.com/products',
data: data,
crossDomain: true, //CORS
cache: false,
}
在这种情况下,URL变为:
http://my.services.com/products?userId=1abc&id%5B%5D=1&id%5B%5D=2&id%5B%5D=3
因为在解析结果中而不是使用id
作为键,所以它使用了id[]
,因此将字符[]
编码为%5B
和%5D
。 / p>
即使我使用此代码也没有运气:
let data = {
'userId': '1abc'
'id': JSON.stringify([1,2,3])
}
或(如本answer所示)
let data = {
'userId': '1abc'
'id[]': [1,2,3]
}
请记住,对于其他调用,上面的代码JQuery AJAX代码可以正常工作。
答案 0 :(得分:3)
请求的问题是因为默认的ASP.Net模型绑定器希望数组通过查询字符串作为单独的键/值对发送,如您的第一个示例URL所示。
要实现此目的,您只需要在jQuery traditional: true
请求中设置$.ajax()
:
let data = {
userId: '1abc'
id: [ 1, 2, 3 ]
}
$.ajax({
type: 'get',
url: 'http://my.services.com/products',
data: data,
traditional: true
});
此外,请注意,在发出AJAX请求时请避免使用绝对URL,如果不按常规维护代码,则很容易遇到CORS问题。我建议尽可能使用相对路径。