【问题标题】:Send array to MVC controller via JSON?通过 JSON 将数组发送到 MVC 控制器?
【发布时间】: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

【问题讨论】:

  • 你想要的结果是什么?你的数组是 jQuery 对象,stringify 版本对我来说很合适。你期待它是什么样子的?
  • 它只是一个包含已检查项目的字符串 ID 的数组。我希望 checkedRecords 包含一个包含所有所选项目 ID 的数组。所选输入的 value 包含我需要的 ID 值。

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


【解决方案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);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      • 2012-11-26
      • 2012-01-29
      • 2016-09-07
      • 2018-11-26
      • 2013-09-26
      相关资源
      最近更新 更多