2012-02-13 55 views
2

我想发送一个对象数组到我的控制器,但有一些困难。MVC如何接收来自json的对象数组?

它正在发送数组,当传递给控制器​​时,数组的对象计数也似乎没问题。 但是,如果你看对象的内部所有属性的对象是null

如何可能?

JAVASCRIPT:

function callme(results) { 
     for (var i = 0; i < results.length; i++) { 
      var endRes = { 
       Id: results[i].id, 
       Icon: results[i].icon 
      }; 
      jsonObj.push(endRes); 
     } 
     sendPackage(jsonObj); 
} 

function sendPackage(jsonObj) { 
    $.ajax({ 
     type: "POST", 
     url: '../../Home/RegisterList', 
     data: { List: jsonObj }, 
     cache: false, 
     dataType: "json", 
     error: function (x, e, data) { 
       alert(data); 
     } 
    }); 
} 

控制器:

[HttpPost] 
public JsonResult RegisterList(ICollection<DetailsModel> List) 
{ 
    foreach (var i in List) ....... // other process will be here 
    ............................... // other process will be here 
    return Json(new { message = "OK" }); 
} 

MODEL:

public class DetailsModel 
{ 
    public string Id { get; set; } 
    public string Icon { get; set; } 
} 
+0

你确定结果[i] .id不是结果[i] .Id?给你的错误会有道理:会添加元素,但为空值。 – peterfoldi 2012-02-13 17:12:53

+0

我相信,在发送之前,对象数组似乎还没有正确的值。但不知何故,它没有达到控制器。 – MrGorki 2012-02-14 10:20:49

+1

一个非常类似的问题在另一个问题有一个更简单的答案 http://stackoverflow.com/questions/7116099/send-array-to-mvc-controller-via-json – Appetere 2012-09-21 17:14:09

回答

4

好的我昨晚通过使用牛顿的JSON.NET解决了这个问题(你可以从NuGet中获得它)。我把数组串起来,并用控制器将它作为字符串接收。最后我用json.net将这个字符串转换(反序列化)为一个集合。

要字符串化:使用相同的代码但改变JSON请求的与所述数据部分:

data: { List : JSON.stringify(jsonObj) }

最后通过接受她:

using Newtonsoft.Json; 
public JsonResult RegisterList(string List) 
     { 
      ICollection<DetailsModel> jsonModel = JsonConvert.DeserializeObject<ICollection<DetailsModel>>(List); 
     } 

瞧;你有一个名为jsonModel的集合!

3

不幸的是模型名单的结合是不是很好,并在显着MVC。请参阅: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

传递列表这样工作的:

数据:{ “列表[0] .ID”: “1”, “列表[0] .Icon”: “测试”}

+0

它也不工作。 – MrGorki 2012-02-14 13:41:14

+0

现在这很奇怪,因为我用你的代码创建了一个项目,它重现了你的错误(数组的大小,但所有的值都是空的),然后将这1行更改为我在这里提供的硬编码测试数据,现在它工作:))。因此,如果您有5分钟的时间,您是否可以创建一个新项目,并显示您在此显示的唯一功能(页面上的1个按钮用于发送数据),并告诉我这是否对您无效? – peterfoldi 2012-02-14 14:21:01

+0

好的我昨晚通过使用牛顿的JSON.NET解决了这个问题。我将数组串起来并将其作为字符串接收。最后,我用json.net将这个字符串转换成一个列表。谢谢你花费你宝贵的时间给我:)真的很感激它 – MrGorki 2012-02-15 11:59:27