JSON 传递给 MVC Rest 接口时数组为空

JSON Array is null when passed to MVC Rest interface

我正在尝试传递一个 JSON 对象,该对象包含通用字符串属性和具有属性的对象数组。

模型对象:

public class Stock
{
    public IEnumerable<Daily> DailyList;
    public string Symbol { get; set; }
    public double PERatio { get; set; }
}

public class Daily
{
    public double EndOfDayPrice { get; set; }
    public int Volume { get; set; }
    public double DayDiff { get; set; }
}

以下是我的 HomeController 代码:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public JsonResult Dump()
    {
        Stock s = new Stock()
        {
            Symbol = "YHOO",
            PERatio = 4.31,
            DailyList = new List<Daily>()
            {
                new Daily {EndOfDayPrice = 4.13, DayDiff = 1.2, Volume = 15000 },
                new Daily {EndOfDayPrice = 4.1, DayDiff = .5, Volume = 1300 }
            }
        };

        return Json(s, JsonRequestBehavior.AllowGet);
    }

    [HttpPost]
    public JsonResult ProcessDataReturned(Stock stock)
    {
        stock = stock;
        // int count = mylist.Length;
        return Json("success");
    }
}

这是我的 JavaScript 在我的页面上:

function calculate(pricelist) {
    var count = 1; //skip first;
    var teststring = { "DailyList": [{ "EndOfDayPrice": 4.13, "Volume": 15000, "DayDiff": 1.2 }, { "EndOfDayPrice": 4.1, "Volume": 1300, "DayDiff": 0.5 }], "Symbol": "YHOO", "PERatio": 4.31 };

    $.post("/home/ProcessDataReturned/", teststring).done(function (data2) { document.write(data2 + "<hr>"); });
    //Tried with the JSON.stringify also.
    $.post("/home/ProcessDataReturned/", JSON.stringify(teststring)).done(function (data2) { document.write(data2 + "<hr>"); });
}

当我转到控制器并观察来自 DailyList 数组的值时,它始终为空。其他属性没问题。我试图让模型(C#)同时使用 IList 和 IEnumerable 作为 属性.

贡献者建议的新代码。我仍然有同样的问题。 Array 仍然是空的(不是 null 因为我在构造函数中初始化它)。

    var x = JSON.stringify({ stock: teststring });
    //Other variations I have tried
    //var x = JSON.stringify(teststring);

    $.ajax({
        url: '@Url.Action("ProcessDataReturned", "home")',
        data: x,
        type: 'POST',
        traditional:true,
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            $('#message').html("Reason was updated");}
    });

解决方法:因为实际上有好几处错了,所以我给了每个人一个信任。此外,我自己发现了一个错误。 1. 我必须使用 ajax 调用的长格式版本。即使用 $.ajax 而不是 $.post 2. 我在服务器上的模型设置不正确。我需要将“{get;set;}”添加到列表的 属性 声明中。我犯了一个愚蠢的错误,下面的代码让我看到了这个问题。 public class 股票 { //public IEnumerable DailyList; //把这个改成这个(愚蠢的错误): public IEnumerable DailyList {get;set;}; public 字符串符号 { 得到;放; } public 双 PERatio { 得到;放; } }

因为您的 collection 项目没有使用索引器正确命名,您需要使用 ajax()traditional: true

var teststring = { "DailyList": [{ "EndOfDayPrice": 4.13, "Volume": 15000, ....}
$.ajax({
  type: 'POST',
  url: '@Url.Action("ProcessDataReturned", "home")', // do not hard code your urls
  traditional: true,
  contentType: "application/json; charset=utf-8",
  data: JSON.stringify({ stock: teststring }),
  ....
})

请注意,如果您的 javascript object 是

{ DailyList[0].EndOfDayPrice: 4.13, DailyList[0].Volume: 15000, ..., DailyList[1].EndOfDayPrice: 4.1, DailyList[1].Volume: 1300, ...}

然后 object 将使用代码中的 $.post() 方法绑定

编辑

您的 Stock class 没有 DailyList(它的一个字段)的 属性,因此默认模型活页夹无法设置值。将其更改为 属性

public IEnumerable<Daily> DailyList { get; set; }