通过JSON向MVC控制器发送数组?

8
我正在尝试通过JSON将数组发送到MVC控制器操作,但遇到了困难。
以下是我的代码和尝试过的方法...
//Get checked records
var $checkedRecords = $(':checked'); //e.g. 3 rows selected = [input 4, input 5, input 6]

//Have tried following:
sendingVar: $checkedRecords.serializeArray(); // gives array of 0's
sendingVar: JSON.stringify($checkedRecords); // gives "{\"length\":1,\"prevObject\":{\"0\":{\"jQuery1313717591466\":1,\"jQuery1313717591653\":13},\"context\":{\"jQuery1313717591466\":1,\"jQuery1313717591653\":13},\"length\":1},\"context\":{\"jQuery1313717591466\":1,\"jQuery1313717591653\":13},\"selector\":\":checked\",\"0\":{}}"...wtf

//Post
$.post(url, { sendingVar: sendingVar }, function(data) {alert(data); });

我该如何做?

编辑:对于那些建议从第一行“原样”发送$checkedRecords的人 - 那不起作用。我在jquery框架中得到了奇怪的异常:(

uncaught exception: [Exception... "Could not convert JavaScript argument" nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)" location: "JS frame :: http://.../.../.../jquery-1.4.4.min.js :: <TOP_LEVEL> :: line 141" data: no]

我认为这意味着它正在尝试将null分配给无法接受的内容。

编辑:我使用的是MVC2而不是3

编辑2:在@Monday的回答之后-问题是由于我构建数组的方式导致的,例如[input 4,input 5,input 6]而不是[4,5,6]-有什么办法可以只获取数组中的值吗?

编辑3:当这不是重复问题时,请停止投票。你真的看了我的问题或者阅读了链接的问题吗?这是一个不同的问题

@Daveo:

我不想在JSON中构建覆盖自定义属性以发送数组,那太荒谬了因为我们已经在这个问题上讨论过,这是不必要的。

MVC3-不相关


1
可能是重复的问题:https://dev59.com/lnRC5IYBdhLWcg3wXPwC 和 https://dev59.com/w2445IYBdhLWcg3wl7TW - Daveo
你期望的结果是什么?你的数组是jQuery对象,我认为stringify版本看起来没问题。你期望它看起来像什么? - BZink
它只是一个包含已选项目字符串ID的数组。我希望checkedRecords包含所有所选项目的ID数组。所选输入的“value”包含我需要的ID值。 - baron
3个回答

24

这是我的演示,使用mvc2,希望有所帮助~

成功的关键是传统

traditional参数设置为true

$(function(){
    var a = [1, 2];
    $.ajax({
       type: "POST",
       url: "<%= ResolveUrl("~/Home/PostArray/") %>",
       data: {orderedIds: a},
       dataType: "json",
       traditional: true,
       success: function(msg){alert(msg)}
    });
})

自从 jQuery 1.4 版本以来,这个参数存在是因为将对象序列化成查询参数的机制已经发生了变化。

而 action 是~

[HttpPost]
public ActionResult PostArray(int[] orderedIds)
{
    return Content(orderedIds.Length.ToString());
}

不幸的是,这并不起作用。控制器方法中的“orderedIds”为空。我怀疑是因为ajax实际上执行了“GET”? - baron
1
@baron - 在我这里,它正常工作。orderedIds是一个参数名。 - Monday
1
抱歉,您是正确的,这段代码确实有效。所以问题在于我如何使用 var $checkedRecords = $(':checked'); 获取选中 ID 数组,它给了我 [input 3, input 4, input 5],而我实际上需要的是:[1, 2]。谢谢。 - baron
谢谢,我用 var items = []; $("input:checked").each(function () { items.push($(this).val()); }); 得到了它。 - baron

0
请使用这个简单的代码。
var url = '/sampleController/sampleAction'
var params = {sendingVar: [1,2]}
$.post(url, params , function (data) {
   $("#lblResult").html(' : ' + data);
}).fail(function (e) {
   alert(e);
});

0

你也可以使用 JSON.stringify 将数据作为字符串发送,然后使用 JavaScriptSerializer 类 检索数据。

在 C# 代码中,获取数据的代码如下:

JavaScriptSerializer js = new JavaScriptSerializer();

js.Deserialize<T>(string paramiter);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接