从 Javascript 将 KeyValuePair 或 IDictionary 列表传递给 Web Api 控制器
Posted
技术标签:
【中文标题】从 Javascript 将 KeyValuePair 或 IDictionary 列表传递给 Web Api 控制器【英文标题】:Passing List of KeyValuePair or IDictionary to Web Api Controller from Javascript 【发布时间】:2013-05-09 08:19:29 【问题描述】:我有一个 web api 控制器,我想向其发布两个参数。一个是 flat int ID,另一个是 IDictionary 或类似的等价物。
[HttpPost]
public void DoStuff(int id, [FromBody]IDictionary<int, int> things)
var things = new Array();
things.push( 1: 10 ); // tried things.push( Key: 1, Value: 10 )
things.push( 2: 11 );
$.ajax(
url: '/api/DoStuff?id=' + id,
data: '=' + JSON.stringify(things), // tried what seems like 100 different things here
type: 'POST',
dataType: 'json'
);
无论我在数据参数(data: things
、data: '=' + things
)中尝试什么,字典都不会通过 api 控制器。它要么为 null,要么有一个虚假条目 (0, 0)。
我也尝试在 Uri 中发送字典 - 不行。
如何将字典或键值对发送到 api 控制器?
【问题讨论】:
【参考方案1】:您不需要数组 - 您需要一个简单的 JS 对象(映射到字典)。这段代码应该可以工作:
var things = ;
things['1'] = 10;
things['2'] = 11;
$.ajax(
url: '/api/DoStuff?id=' + id,
data: JSON.stringify(things),
contentType: 'application/json'
type: 'POST',
dataType: 'json'
);
【讨论】:
这不起作用。 Dictionary 参数在 ApiController 中作为 null 传入。 在我的答案中,data
参数的开头有一个额外的“=”(我只是对其进行了编辑以将其删除)。删除它后,它应该可以工作。基本上,请求(尝试在 fiddler 或浏览器的开发人员工具中查看)正文应该是 "1":10,"2":11
。如果这就是你所拥有的,那么参数应该正确绑定到字典。
是的,做到了!非常感谢!
我花了一些时间来完成这项工作。我正在进行 GET 调用 [FromUri],但在切换到 POST [FromBody] 之前无法让它工作。然后它起作用了! :-)【参考方案2】:
这个对我有用:
var settings = [];
settings.push( key: "setting01", value: "Value01" );
settings.push( key: "setting02", value: "Value02" );
【讨论】:
这对我来说效果最好,虽然我还必须引用键和值,因为我是第一个 JSON.parse'ing,所以我必须这样做:settings.push(JSON.parse('"key": "settingX", "value": "valX"'));
【参考方案3】:
这真的很老了,但是在 JS 中我创建了一个像 @cesardaniel 这样的对象:
var dictionary = [];
dictionary.push( key: 1, value: [1,2,3,4,5] );
dictionary.push( key: 2, value: [6,7,8,9,0] );
但我在 .net 中的对象形状是 Dictionary<KeyValuePair<int, IEnumerable<int>>
类型。然后 web api 就可以获取它了。希望这对未来的读者有所帮助!
【讨论】:
【参考方案4】:字典就像一个键值对数组。你必须发送
var data =
data['things[0].Key'] = x
data['things[0].Value'] = y
// etc
编辑:
你的 js 应该是这样的
var data = ;
data['things[0].Key'] = 1;
data['things[0].Value'] = 1;
data['things[1].Key'] = 22;
data['things[1].Value'] = 12;
$.ajax(
url: /api/DoStuff?id=' + id,
data: data,
type: 'POST',
dataType: 'json'
);
并采取类似的行动
public ActionResult DoStuff(int id, Dictionary<int, int> things)
// ...
【讨论】:
我试过了,但还是不行。您能否发布一个我可以尝试的完整示例?从您的帖子中我仍然不确定如何将您提供的这个数组提供给 ajax 调用的 data 参数。 我完全按照你的方式试了一下,还是不行。 “事物”字典是空的。我看到您正在从控制器方法返回 ActionResult。也许您错过了我使用的是 ApiController 而不是常规控制器?我认为这会改变发布内容的方式,因为它使用了 Http。 yup.. 在这种情况下,***.com/questions/11950351/… 可能是重复的 我无法理解该线程的 OP 如何将响应视为答案。回答的人发布了一篇文章的链接,该文章是在微软发布 Web Api 之前 3 年写的。它不包含此问题的答案。以上是关于从 Javascript 将 KeyValuePair 或 IDictionary 列表传递给 Web Api 控制器的主要内容,如果未能解决你的问题,请参考以下文章
Laravel JavaScript 将数组从后端传递到 JavaScript 中的数组