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

时间:2011-08-19 01:42:17

标签: c# jquery asp.net-mvc json

我正在努力,通过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); });

我该怎么做?

编辑:建议那些建议从顶线发送“{1}}”的人 - 这是行不通的。我在jquery框架中的某个地方得到一个奇怪的异常:(

$checkedRecords

我认为这意味着它试图将null分配给它不能的东西。

编辑:我正在使用MVC2而不是3

Edit2:在@ Monday的答案之后 - 问题是由于我如何构建数组 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] 而不是[input 4, input 5, input 6] - 任何想法我怎么能得到而不是数组中的值?

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

@Daveo:

I don't want to build in an overriding custom attribute just to send an array from JSON, that is rediculous正如我们已经在这个问题中所涵盖的那样 - 没有必要。

MVC3 - irrelevant

3 个答案:

答案 0 :(得分:24)

这是我的演示,使用mvc2,希望有些帮助〜

成功的关键是traditional

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存在此参数,因为将对象序列化为查询参数的机制已更改。

并且行动是〜

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

答案 1 :(得分:0)

您也可以使用JSON.stringyfy将数据作为字符串发送,然后使用JavaScriptSerializer class来检索数据。

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

JavaScriptSerializer js = new JavaScriptSerializer();

js.Deserialize<T>(string paramiter);

答案 2 :(得分:0)

使用这个简单的代码

var url = '/sampleController/sampleAction'
var params = {sendingVar: [1,2]}
$.post(url, params , function (data) {
   $("#lblResult").html(' : ' + data);
}).fail(function (e) {
   alert(e);
});