从 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: thingsdata: '=' + 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&lt;KeyValuePair&lt;int, IEnumerable&lt;int&gt;&gt; 类型。然后 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 控制器的主要内容,如果未能解决你的问题,请参考以下文章

将变量从 Flask 传递到 JavaScript

Laravel JavaScript 将数组从后端传递到 JavaScript 中的数组

在 javascript 模式下将连接器类型从 javascript 更改为 Database Reader?

Rails - 将信息从视图传递到 Javascript

将变量从VB函数传递到客户端javascript

如何将变量和数据从 PHP 传递到 JavaScript?