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

Posted

技术标签:

【中文标题】通过 JSON 将数组发送到 MVC 控制器?【英文标题】:Send array to MVC controller via JSON? 【发布时间】:2011-10-30 06:35:13 【问题描述】:

我正在尝试并努力通过 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

Edit2:在@Monday 的回答之后- 问题是由于我如何构建数组,如 [input 4, input 5, input 6] 而不是[4,5,6] - 任何想法我如何才能获取数组中的值而是?

Edit3:如果不是,请停止重复投票。您是否真的阅读了我的问题或阅读了链接的问题?这是一个不同的问题

@Daveo:

I don't want to build in an overriding custom attribute just to send an array from JSON, that is rediculous 我们已经在这个问题中讨论过——没有必要。

MVC3 - irrelevant

【问题讨论】:

可能重复:***.com/questions/320291/… 和 ***.com/questions/4789481/… 你想要的结果是什么?你的数组是 jQuery 对象,stringify 版本对我来说很合适。你期待它是什么样子的? 它只是一个包含已检查项目的字符串 ID 的数组。我希望 checkedRecords 包含一个包含所有所选项目 ID 的数组。所选输入的 value 包含我需要的 ID 值。 【参考方案1】:

这是我的demo,使用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());

【讨论】:

不幸的是,这不起作用。 orderedIds 在控制器方法中为空。我怀疑是因为 ajax 实际上做了一个 GET? @baron - 在我的位置,它工作正常。 orderedIds是参数名 嗯抱歉,你说得对,这段代码确实有效。所以问题在于我如何使用var $checkedRecords = $(':checked'); 获取已检查ID 的数组,这给了我[input 3, input 4, input 5] 我真正需要的地方:[1, 2]。谢谢 谢谢,我收到了var items = []; $("input:checked").each(function () items.push($(this).val()); );【参考方案2】:

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

在 C# 代码中,要获取数据,将如下所示:

JavaScriptSerializer js = new JavaScriptSerializer();

js.Deserialize<T>(string paramiter);

【讨论】:

【参考方案3】:

使用这个简单的代码

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

【讨论】:

以上是关于通过 JSON 将数组发送到 MVC 控制器?的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 字符串发送到 MVC 控制器失败

如何将对象类型的 json 数组传递给 MVC 控制器类

将json发送到控制器时,ASP.NET mvc 4控制器参数始终为空,为啥?

将数组作为 JSON 发布到 MVC 控制器

无法将 JSON 数据发送到 asp.net MVC 控制器中的另一个操作

通过 jQuery.Ajax 向 MVC 控制器发送多个项目