将Json Array发送到MVC Controller会带来空模型吗?

时间:2016-02-24 06:24:10

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

我的控制器如下:

[HttpPost]
public JsonResult getCartFromClient(List<JSItem> data)
{
   return view();
}

和我的JS代码发送Json如下:

   var list = JSON.parse(localStorage.getItem('cart'));
   $.ajax({

            url: "CheckOut/getCartFromClient/",

            contentType: "application/json",
            dataType: 'json',
            type: "POST",
            data: JSON.stringify(list)
        });

现在的问题是,当调用conttroller时,数据将包含数组中正确数量的项,但每个JSItem的内容为null,Id为null,名称为null ..!?

不确定导致此问题的原因!我在列表中获得了正确数量的对象,但内容为空?

ViewModel如下:

public class JSItem
{
    public string xid { get; set; }
    public string xamount { get; set; }
    public string xprice { get; set; }
    public string xname { get; set; }
    public string xlevel { get; set; }
    //public string ximg { get; set; }
}

public class Rootobject
{
    public JSItem JSItem { get; set; }
}

Json.stringify(list)将带来以下json文件:

"[{"JSItem":{"xid":"2","xamount":"1","xprice":"50.00","xname":"BaBy Product 1","xlevel":"0"}},{"JSItem":{"xid":"3","xamount":"1","xprice":"0.00","xname":"BaBy Product 122","xlevel":"0"}}]"

1 个答案:

答案 0 :(得分:1)

您的JSON数据似乎比JSItem高一级。

将控制器操作更改为RootObject,然后查看。

[HttpPost]
public JsonResult getCartFromClient(List<RootObject> data)
{
   return view();
}

如果您不想这样做,请按照Stephen Muecke在评论中的建议发送JSOn,以便将其反序列化为List<JSItem>

至于为什么你看到List<JSItem>的正确计数,但所有空值,原因是:

当MVC尝试将此值反序列化为List<JSItem>

"[
 {
  "JSItem":{"xid":"2","xamount":"1","xprice":"50.00","xname":"BaBy Product 1","xlevel":"0"}
 },
 {
  "JSItem":{"xid":"3","xamount":"1","xprice":"0.00","xname":"BaBy Product 122","xlevel":"0"}
 }
 ]"

MVC能够识别输入是具有计数2的元素数组。 所以它用2个元素初始化List<JSItem>。并且它开始为每个项目新建JSItem,作为模型绑定的一部分。

但是,当它尝试设置此新建的JSItem的属性时,它在JSON中找不到任何匹配的字段。这是因为您的JSON比JSItem高一级。因此所有字段都为空。